私はこの答えで全体像を示すようにします。
括弧で囲まれた以下の考えは、問題を最近テストしたところまで私の信念でした。
[[ 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
可能な場合は、または他の複雑なライブラリ関数に固執します。;)