我试图用这个答案给出一个广泛的画面。
括号中的以下想法是我的信念,直到我最近测试了这个问题:
[[对于像C / C++这样的低级语言,代码被编译,以便处理器在变量为零(或非零)时具有特殊的条件跳转命令。
此外,如果您关心这么多的优化,您可以代替,因为是单个处理器命令,而意味着.]]
++i
i++
++i
i++
j=i+1, i=j
真正快速的循环可以通过展开它们来完成:
for(i=800000;i>0;--i)
do_it(i);
它可能比
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
但其原因可能相当复杂(顺便提一下,游戏中存在处理器命令预处理和缓存处理的问题)。
就高级语言而言,如您所问的JavaScript,如果您依赖库、内置函数进行循环,则可以优化事物。让他们决定如何最好地完成。
因此,在 JavaScript 中,我建议使用类似
array.forEach(function(i) {
do_it(i);
});
它也不易出错,并且浏览器有机会优化您的代码。
[备注:不仅是浏览器,您也有空间轻松优化,只需重新定义forEach
功能(取决于浏览器),使其使用最新的最佳技巧!:) @AMK 说在特殊情况下值得使用array.pop
or array.shift
。如果你这样做,把它放在窗帘后面。最大的矫枉过正是添加选项来forEach
选择循环算法。]
此外,对于低级语言,如果可能的话,最好的做法是使用一些智能库函数来进行复杂的循环操作。
这些库还可以将事物(多线程)放在您的背后,并且专业的程序员也可以使它们保持最新状态。
我做了更多的审查,结果证明在 C/C++ 中,即使对于 5e9 = (50,000x100,000) 操作,如果测试是针对 @alestanis 所说的常量进行的,上下之间没有区别。(JsPerf 结果有时不一致,但总的来说是一样的:你不能有很大的不同。)
所以--i
碰巧是一件相当“时髦”的事情。它只会让你看起来像一个更好的程序员。:)
另一方面,在这种 5e9 的情况下展开,它使我在 10 秒时从 12 秒下降到 2.5 秒,而当我在 20 秒时下降到 2.1 秒。它没有优化,优化已经把事情拖到了无法衡量的时间。:) (展开可以按照我上面的方式或使用 来完成i++
,但这并不能在 JavaScript 中带来优势。)
总而言之:保持i--
/i++
和++i
/i++
对工作面试的差异,坚持array.forEach
或其他复杂的图书馆功能(如果可用)。;)