Javascript 为什么此代码在不同的值下表现不同
此代码:Javascript 为什么此代码在不同的值下表现不同,javascript,Javascript,此代码: var i = 10000000000; do { i--; } while (i !== 0); //Result: 38 second. var i = 10000000000; do {} while (i-- !== 0); //Result: 27 second. //(same result with while (i--) var i = 10000000000; do {} while (i-- | 0); //Result: 13.5 second. 问
var i = 10000000000;
do {
i--;
}
while (i !== 0);
//Result: 38 second.
var i = 10000000000;
do {}
while (i-- !== 0);
//Result: 27 second.
//(same result with while (i--)
var i = 10000000000;
do {}
while (i-- | 0);
//Result: 13.5 second.
问题是:为什么这些版本对于较小的i值获得相同的时间?如果我从I上切下一个零;所有版本都需要2.2秒。(即使在JIT优化之后也进行了测试-仅在V8中)
第三个版本应该总是更快,这似乎是合乎逻辑的,但只有在非常高的值时才更快
这只是一种好奇……实际上并不重要。处理器、操作系统和解释器会以难以预测的方式干扰程序的速度。这就是为什么使用大oh符号来评估算法 这里速度可能不同的原因之一是,如果少了一个零,
i
的值只能用32位来表示。因此,解释器生成的汇编代码可以执行优化并使用32位整数的指令
最后一段代码中
i
的值被转换为32位整数,从而改变迭代次数,这就是为什么当i
的值不能仅用32位表示时,它的执行速度更快。我尝试将其放入jsperf中,但它往往会使我的浏览器崩溃。请记住,不同的javascript引擎会产生不同的结果,因为它们优先处理不同的事情。它可以归结为一些简单的事情,比如底层操作系统处理数字的方式。(更新:测试已经运行,但是JSperf抛出了一个关于丢失自己的name
属性的错误。不知道为什么会发生这种情况)最后一个是最快的,因为它只迭代1410065408次,实际上是第二个版本的速度的1/3,即每秒104449290次,每秒370370370次。观察良好。我没有注意到。