+=、++和+之间的性能差异

7

13
请在此处发布您的代码和结果,而不是期望他人前往其他网站并执行您的代码。 - Bill the Lizard
1
++var 比 var++ 快! :) - tiagoboldt
1
你正在快速地像这样向你的页面添加结果。几乎感觉像是在钓测试和访问者... - Emond
@Alistair Laing 去学习汇编语言吧。你会发现为什么 += 的操作码更高效,因为它需要更少的处理器周期。 - Raynos
请不要感到被指责。我只是开玩笑而已。我对Chrome和IE9之间的差异感到惊讶。顺便说一下:IE9不再是测试版了... - Emond
显示剩余8条评论
4个回答

9

因为你的测试是有问题的。你正在重复使用同一个变量,所以它变得越大,增加速度就越慢。看看这个链接:http://jsperf.com/loop-counter/6

这是jsperf的工作方式 - 准备代码仅在所有测试之前运行一次。


好的,在我的测试中,第一个代码示例不再是最快的,因为每个示例都使用自己的变量进行递增。我已经在fx4和chrome 10中进行了测试。 - wildcard
因为在原始测试中,在第一个测试之后,第二个测试使用了l_count的值,此时不再是0。而“通配符”版本使用了不同的变量,所以所有的测试都从0开始。在这种情况下,几乎没有什么区别了。对于这个答案加1分。 - KooiInc
谢谢通配符。我没有意识到准备代码只需要执行一次,但结果仍然非常有趣。 - Alistair Laing
2
@wildcard — 没有理由表明数值会影响操作速度。为了测试这一点,我修改了你的设置,将第二个变量从2^31开始计数...速度没有变化。可能与变量访问有关?这让我感到困惑。 :-) - Ben Blank
@通配符 — 我更新了我的测试以包括浮点数和大整数。现在只有后增量运算符在浮点数和大整数上变慢了。我仍然无法弄清楚发生了什么… :-D - Ben Blank
显示剩余5条评论

2

我试着多次运行这三个测试,每次重新加载页面后,我尝试的第一个测试明显是最快的。

因此,我猜测测试存在某些问题,可能是测试时间太短,也就是运行测试的代码占用了大部分时间。


我同意,我添加了一个修订版/3,改变了测试的顺序,第一个测试又“获胜”了... - Mesh
1
问题不在于测试太短,而是一个变量被重复使用了。我的回答解释得比较清楚:https://dev59.com/PlXTa4cB1Zd3GeqP25Sq#5434346 - wildcard

2
如果这不是一个修辞问题,你真的想要答案,那么原因是因为人们在浏览器中编写了JS引擎。

2
这是因为程序在后台执行以下操作: l_count += 1; 这会将数字1添加到变量中。 l_count = l_count + 1; 这会调用变量l_count,读取它,将1添加到结果中,并将其传递回l_count。 l_count++; 这会在运行该行代码后将1添加到变量中。因此,在完成该行时,值存储在另一个临时变量中,然后返回该值,将1加入并保存回原始值。

它完全是有道理的,但是 ++x 也应该更快才对。但实际上并不是这样: http://jsperf.com/loop-counter/5 - wildcard
这只是一个小差别,可能是由于内存分配和线程时间片的原因。只需改变最后两个之间的顺序。在l_count++之前放置++l_count...你几乎看不出任何区别。毕竟只有1个操作码的差异。事实上,它保存结果所需的临时变量才是真正的区别。 - Yochai Timmer
这个链接与问题并不相关,我会将其删除。 - Yochai Timmer
在其他地方弄明白了(请参见https://dev59.com/PlXTa4cB1Zd3GeqP25Sq#5434346中的评论)-如果您正在处理小整数,那么使用 post 或 preincrementation 对性能没有影响,因为编译器足够聪明,能够进行自己的优化,并在可能时将 post 转换为 preincrementation。 - wildcard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接