C-i-- 比 i++更快?

发布于 2017-01-04 11:04:05 字数 40 浏览 1371 评论 8

在一个帖子上看到,同等情况下,i--运行速度比i++更快。为什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

甜柠檬 2017-10-26 10:38:17

应该不会啊,CPU在处理加减法的时候基本上是一样的,做减法就相当于加上这个数的反码而已,不会出现效率的不一样

想挽留 2017-08-16 13:51:45

看汇编代码,仅仅看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)要快。

灵芸 2017-05-10 16:40:51

其实我认为,一般而言是没有太多区别的,主要是在应用过程中,总数若是通过计算得到的,可能会增加复杂度

灵芸 2017-05-02 11:39:32

据我所知,++i会比i++快,因为i++需要创建一个临时变量保存i的原值。

瑾兮 2017-04-30 09:35:02

因为汇编之后,i++的命令数比i--多一条。

浮生未歇 2017-03-04 19:54:26

不可能,底层加法和减法都是通过加法器来实现的,数据存储的时候是通过二进制补码的方式存储的,所以对于减法也是直接用加法来实现的。如果说出现了差别,只能说是测试的代码本身造成了性能的差异。详细内容可以参考数字逻辑相关内容。

夜无邪 2017-01-25 17:11:29

应该不会吧, 我感觉应该是++比--快的, 计算机的加法比减法快

甜柠檬 2017-01-14 03:57:26

只听说过++i的效率要比i++的效率高,i++会创建个临时变量,i++ 和 i--的效率应该不会有什么差别吧!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文