在一个帖子上看到,同等情况下,i--运行速度比i++更快。为什么?
应该不会啊,CPU在处理加减法的时候基本上是一样的,做减法就相当于加上这个数的反码而已,不会出现效率的不一样
看汇编代码,仅仅看i++和i--并没有效率上的提高。
; 6 : i++;
mov eax, DWORD PTR _i$[ebp]add eax, 1mov DWORD PTR _i$[ebp], eax
; 7 : --i;
mov eax, DWORD PTR _i$[ebp]sub eax, 1mov DWORD PTR _i$[ebp], eax
程序都需要两次访存,一次寄存器运算操作。不过,若是将i--和i++放到一个for循环中,并将i的值作为测试条件,前者的效率确实要高些。直接看汇编代码。
; 8 : for (i=0; i<total; i++)
mov DWORD PTR _i$[ebp], 0jmp SHORT $LN6@main$LN5@main:mov eax, DWORD PTR _i$[ebp]add eax, 1mov DWORD PTR _i$[ebp], eax$LN6@main:mov eax, DWORD PTR _i$[ebp]cmp eax, DWORD PTR _total$[ebp]jge SHORT $LN4@main
; 9 : {; 10 : ;; 11 : }
jmp SHORT $LN5@main$LN4@main:
; 12 :; 13 : for (i=total; i>0; i--)
mov eax, DWORD PTR _total$[ebp]mov DWORD PTR _i$[ebp], eaxjmp SHORT $LN3@main$LN2@main:mov eax, DWORD PTR _i$[ebp]sub eax, 1mov DWORD PTR _i$[ebp], eax$LN3@main:cmp DWORD PTR _i$[ebp], 0jle SHORT $LN1@main
; 14 : {; 15 : ;; 16 : }
jmp SHORT $LN2@main$LN1@main:
对比下汇编代码,就可以看到,判断i>0比判断i<total要少一次内存读取操作。所以这个问题准确的讲,不是i--要比i++要快,而是在循环中用一个立即数(这里指0)作为判断条件比用变量(total)要快。
其实我认为,一般而言是没有太多区别的,主要是在应用过程中,总数若是通过计算得到的,可能会增加复杂度
据我所知,++i会比i++快,因为i++需要创建一个临时变量保存i的原值。
因为汇编之后,i++的命令数比i--多一条。
不可能,底层加法和减法都是通过加法器来实现的,数据存储的时候是通过二进制补码的方式存储的,所以对于减法也是直接用加法来实现的。如果说出现了差别,只能说是测试的代码本身造成了性能的差异。详细内容可以参考数字逻辑相关内容。
应该不会吧, 我感觉应该是++比--快的, 计算机的加法比减法快
只听说过++i的效率要比i++的效率高,i++会创建个临时变量,i++ 和 i--的效率应该不会有什么差别吧!
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(8)
应该不会啊,CPU在处理加减法的时候基本上是一样的,做减法就相当于加上这个数的反码而已,不会出现效率的不一样
看汇编代码,仅仅看i++和i--并没有效率上的提高。
; 6 : i++;
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
; 7 : --i;
mov eax, DWORD PTR _i$[ebp]
sub eax, 1
mov DWORD PTR _i$[ebp], eax
程序都需要两次访存,一次寄存器运算操作。
不过,若是将i--和i++放到一个for循环中,并将i的值作为测试条件,前者的效率确实要高些。直接看汇编代码。
; 8 : for (i=0; i<total; i++)
mov DWORD PTR _i$[ebp], 0
jmp SHORT $LN6@main
$LN5@main:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
$LN6@main:
mov eax, DWORD PTR _i$[ebp]
cmp eax, DWORD PTR _total$[ebp]
jge SHORT $LN4@main
; 9 : {
; 10 : ;
; 11 : }
jmp SHORT $LN5@main
$LN4@main:
; 12 :
; 13 : for (i=total; i>0; i--)
mov eax, DWORD PTR _total$[ebp]
mov DWORD PTR _i$[ebp], eax
jmp SHORT $LN3@main
$LN2@main:
mov eax, DWORD PTR _i$[ebp]
sub eax, 1
mov DWORD PTR _i$[ebp], eax
$LN3@main:
cmp DWORD PTR _i$[ebp], 0
jle SHORT $LN1@main
; 14 : {
; 15 : ;
; 16 : }
jmp SHORT $LN2@main
$LN1@main:
对比下汇编代码,就可以看到,
判断i>0比判断i<total要少一次内存读取操作。
所以这个问题准确的讲,不是i--要比i++要快,而是在循环中用一个立即数(这里指0)作为判断条件比用变量(total)要快。
其实我认为,一般而言是没有太多区别的,主要是在应用过程中,总数若是通过计算得到的,可能会增加复杂度
据我所知,++i会比i++快,因为i++需要创建一个临时变量保存i的原值。
因为汇编之后,i++的命令数比i--多一条。
不可能,底层加法和减法都是通过加法器来实现的,数据存储的时候是通过二进制补码的方式存储的,所以对于减法也是直接用加法来实现的。如果说出现了差别,只能说是测试的代码本身造成了性能的差异。详细内容可以参考数字逻辑相关内容。
应该不会吧, 我感觉应该是++比--快的, 计算机的加法比减法快
只听说过++i的效率要比i++的效率高,i++会创建个临时变量,i++ 和 i--的效率应该不会有什么差别吧!