update.JavaScriptで画像処理などの重い計算をしているとどうしても気になるのがループの部分。実際の処理に加えてループの部分でのロスが気になり始めたので実際にどのループ方法が速いのか試してみました。概要0~9999999の長さ1000万の配列のすべてを足し合わせるという単純な計算を行います配列は、各ループの前で常に初期化を行います。ループはforまたはwhileを用います。foreachやforinは使いません。v8(Node.js)、Chrome、Firefox、Safariで実験を行います筆者が噂で聞いた5つのポイント(後述)を加味した計32種類のコードを自動生成し、実行します。各プラットフォームで5回実行し、平均をとります。ウェブブラウザではWebWorkerを用いて実行します。Goodpartsなどで言われている、forの条件文のところで配列のlengthにアクセスしてはいけない、という説です。JavaScriptの配列のlengthは遅いのでループ中に呼ぶと遅くなるということですが、どうなのでしょうか。デクリメント筆者が聞いた「配列は前から後ろに走査したほうが速い」「数値は--した方が速い」という対立する2つの噂のどちらが正しいのかを検証します。i+1これも筆者が聞いたi++が速い説とi=i+1が速い説(もしくは--,-1)を検証します。{}ポイント5:|0|0とは、Googleの中の人が言っていた「jsのJITコンパイラに型を認識させる裏技」です。プログラミング言語の講義資料を作っていて行列積の速度を比較してみたのだが、C言語=1.8秒、Java=1.9秒、Python=18分、ChromeのJavaScript=3.6秒。型無しの言語仕様でここまでがんばるJavaScriptはすごい。ブラウザ間の熾烈な速度競争の結果。hoge|0;こうすることでfugaも数値型だと認識されるので計算が速くなるらしいです。さんからのテーブルのo/xが分かりづらいとご指摘を受けました。対応は、以下になります。Node.js(v8)では、コードのイテレーションにlengthを用いたものが最速でしたが、使わなかったものとの差は3~10msほどでした。Firefoxでは異なり、最速コードの当該ポイントをlengthに変えたものとの差は約100ms、1.75倍の違いがありました。これらから以下の結果が分かりました。forとwhileすべてのプラットフォームでwhileが最速でした。Node.jsでは最速コードのforを使ったverとの差はわずか4msでした。この結果から、以下の事がわかります。インクリメントとデクリメントWebKit由来のブラウザでは、インクリメントとデクリメントの差はないようです。Firefoxでは、デクリメントとインクリメントで50msほどの差がありました。インクリメントとデクリメントの差がある場合とない場合がある。それどころか、最速コードを++/--にしたコードは、約3倍遅いことが分かりました。|0すべてのブラウザで、|0でtypedを施したコードが最速でした。最速コードとの比較では、使わない場合2〜3倍の差が出るようです。型を認識させることは重要これが最速のループ文だ!(?)...を書こうと思ったのですが、FirefoxとWebKit系で振る舞いが違いすぎる結果を受け、IEとかどうなるのかも分からなくなったので、書くことは控えさせていただきます。インクリメントする部分は以下のように書くといいのは確かなようです。i=(i+1)|0注意この記事の結果は、筆者のパソコン、ブラウザ、CPU、メモリなどの実行環境によって左右されている可能性があります。鵜呑みにしないでください。upLoginユーザーは見つかりませんでした。