我试图用这个答案来概括一下。
在最近测试该问题之前,以下是方括号中的想法:
[[就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
或array.shift
。如果这样做,请将其放在窗帘后面。的最大矫枉过正是添加选项,forEach
选择循环算法。]
此外,对于低级语言,最佳实践是尽可能使用一些智能库功能来执行复杂的循环操作。
这些库还可以将事物(多线程)放在背后,并且专业的程序员可以使它们保持最新。
我进行了更多的检查,结果发现在C / C ++中,即使对于5e9 =(50,000x100,000)运算,如果对@alestanis这样的常量进行测试,则向上和向下之间也没有区别。(JsPerf的结果有时不一致,但是总的说来是一样的:您不可能有什么大的不同。)
因此,--i
恰好是“正题”。它只会使您看起来像一个更好的程序员。:)
另一方面,在这种5e9情况下展开时,它使我从10秒时的12秒降低到2.5秒,而到20秒时则从2.1秒降低到2.1秒。这是没有优化的,而优化使事情降到了不可估量的很少的时间。:)(可以通过上面的方式或使用来完成展开操作i++
,但这无法使JavaScript发挥作用。)
总而言之:保留i--
/ i++
和++i
/i++
在面试中不同,坚持使用array.forEach
或其他复杂的库功能。;)