困惑很久的代码效率问题!

yfwill 2004-05-08 02:43:57
循环当中
if( i == 100 )
i = 0;

i %= 100;
哪个代码效率更高?
...全文
44 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2004-05-08
  • 打赏
  • 举报
回复
if( i == 100 )
i = 0;
这种写法中,开销比较大的是跳转语句.跳转语句会打乱CPU的指令队列,这对于流水线很长的CPU(如新的P4)来说,会有比较大的性能损失.

i %= 100;
这种写法中,开销比较大的是除法.但它不会打乱CPU的指令队列,只要除法运算够快,它对性能的影响应该不是很大.

但是,现在的CPU的指令预取算法的命中率很高,相对地减少了跳转对运算速度的影响.所以,经过测试,跳转比除法要快近20倍.

不过以上写法还存在一种特例.就是当你的N不是100,而是0x100时,编译器就会把除法优化为按位与操作,这时,第二种写法又要比第一种快那么一点点.
sharkhuang 2004-05-08
  • 打赏
  • 举报
回复
反汇编出来看看就知道了
gernal_dn 2004-05-08
  • 打赏
  • 举报
回复
汇编中没有取模,取模只能通过除法进行。
在现在的CPU中,整数的加、减、乘、逻辑运算都可在一个时钟周期内完成,偏偏除法不行。

不过,那两条语句的作用相同么?!
ShadowCpp 2004-05-08
  • 打赏
  • 举报
回复
一般来说没有可比性的。
不过同意这位朋友的说法。

--------------------------------
if( i == 100 )
i = 0;

的效率高,计算机只是做一次减法,判断,在赋值

i %= 100;
是取模,再赋值,取模比较费时
---------------------------------
cngdzhang 2004-05-08
  • 打赏
  • 举报
回复
if( i == 100 )
i = 0;

的效率高,计算机只是做一次减法,判断,在赋值

i %= 100;
是取模,再赋值,取模比较费时
yym314 2004-05-08
  • 打赏
  • 举报
回复
我也想知道
sunwhite 2004-05-08
  • 打赏
  • 举报
回复
我认为这两段代码几乎没有什么可比性嘛

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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