为什么此代码在不同的值上表现不同

7 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.
Run Code Online (Sandbox Code Playgroud)

问题是:为什么这些版本会同时获得较小的i值?如果我从i中减去一个零; 所有版本都需要2.2秒.(甚至在JIT优化后测试 - 仅在V8中测试)

似乎合乎逻辑的是,第三个版本应该总是更快,但只有非常高的值才会更快.

这只是一种好奇心......实际上并不重要.

Wat*_*oll 0

处理器、操作系统和解释器可能会以难以预测的方式干扰程序的速度。这就是为什么使用大 oh 符号来评估算法。

这里速度可能不同的原因之一是,少一个零,您的值i就可以仅使用 32 位来表示。因此解释器生成的汇编代码可以执行优化并使用32位整数的指令。

另外,最后一个代码中的值i被转换为 32 位整数,改变了迭代次数,这就是为什么当 的值i无法仅使用 32 位来表示时它执行得更快。