C++for循环中使用>和>=的效率问题

william7_138 2014-04-23 04:28:53
先贴源代码
本来在研究--i和++i在for循环中的效率问题,结果发现循环条件使用<要快于<=,>和>=同理,运行时间打印和反汇编如下:


优化之后,运行时间打印和反汇编如下:

本人汇编接触不是很多,感觉上面的情况不是很好理解,因为实际上优化之后>=在判断的地方比>少了一条test语句,应该是ADD操作之后修改了SF标志,JNS条件转移指令根据SF==0来转移,为什么速度还不如多了一条test指令的使用>的循环。
而对于++i使用的<和<=,比较都是用的cmp,我在想是不是条件转移指令的不同导致的,小弟对底层了解不多,工作才一年多,但是对技术底层很感兴趣,希望各位技术大牛们有时间解决一下我的问题,欢迎讨论和批评。
注:反汇编只贴了--i的部分
...全文
424 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-04-24
  • 打赏
  • 举报
回复
大部分时间都在内存的读写, <,<=等仅占了少量的时间,这个统计没有意义。
FancyMouse 2014-04-24
  • 打赏
  • 举报
回复
居然用volatile……
千树之影 2014-04-24
  • 打赏
  • 举报
回复
楼主说反了吧,i>0才能优化成i!=0,直接用符号位判断。所以快一些
william7_138 2014-04-24
  • 打赏
  • 举报
回复
引用 6 楼 baipv008 的回复:
楼主说反了吧,i>0才能优化成i!=0,直接用符号位判断。所以快一些
有一种说法是这样解释的,说是因为i- -操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。 i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志,这对于i < n的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。 详细出处参考:http://www.jb51.net/article/25892.htm 但是不知道是不是编译器的缘故,和VS2008这边的反汇编不太一样。我的意思是,我贴的汇编代码i>=0的判断是通过N(结果为负)标志去做的转移指令的判断,我也很疑惑为什么i>0没有像你所说的那样做。
wx602350769 2014-04-23
  • 打赏
  • 举报
回复
对楼主的敬仰犹如滔滔江水呀,刚工作就这水平了,汗颜呀
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
提醒: 使用电脑计时有时误差会很大,因为待测程序段的运行会影响电脑时钟。 将待测程序段循环足够多次,手动掐秒表计时可能更准确。
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
另外:无profiler不谈效率。
赵4老师 2014-04-23
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应debug版汇编一行! 单步对应debug版汇编千行不如单步对应release版汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想单步对应release版汇编,在要单步的源代码处临时插入一行__asm int 3或DebugBreak();。一般人我不告诉他。
william7_138 2014-04-23
  • 打赏
  • 举报
回复
希望技术大牛们能对上述现象讲解一下,也希望能够总结一下在for循环中使用--i和++i的区别,还有就是使用>和>=的效率问题,此外补充一下,我用的是VS2008。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧