这段代码:
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中测试)
似乎合乎逻辑的是,第三个版本应该总是更快,但只有非常高的值才会更快.
这只是一种好奇心......实际上并不重要.
处理器、操作系统和解释器可能会以难以预测的方式干扰程序的速度。这就是为什么使用大 oh 符号来评估算法。
这里速度可能不同的原因之一是,少一个零,您的值i就可以仅使用 32 位来表示。因此解释器生成的汇编代码可以执行优化并使用32位整数的指令。
另外,最后一个代码中的值i被转换为 32 位整数,改变了迭代次数,这就是为什么当 的值i无法仅使用 32 位来表示时它执行得更快。