forループを極める

for文を早くする

一般的なforループは以下のとおりです。


for ( var i = 0; i < myarray.length; i++){
    console.log(i);
}

Nicholas Zakas著『ハイパフォーマンスJavaScript』(O'Reilly) によると、配列や配列に似たオブジェクトに対してforループを処理する場合、以下のように配列の長さを一度変数にキャッシュしておく方法を紹介しています。これによって、毎回配列の長さを取得する必要がなくなります。

同著によれば、Safari 3で2倍、IE7で190倍速度が違うとのこと。個人的に開発してきた小規模のサービスでこの違いを大きく実感することはあまりありませんが、このようなTipsがあるのを知っておけば、大規模サービス開発の際になにかしら役に立つかもしれません。


for ( var i = 0, len = myarray.length; i < len; i++){
    console.log(i);
}

また、ループ内でDOM要素を追加・削除するなど長さが変わってしまうような場合は var文を外に出して宣言しておけば大丈夫です。


function myFunc(){

    var i = 0,
        len,
        myarray = [];

    //...

    for ( i = 0, len = myarray.length; i < len; i++){
        // ...
    }

}

for文をもっと早くする

ここから先は少しテクニックに走りすぎている感もありますが、 コンペや、速度が命のネットワーキングあたりを書いているときなどでは 知っておくといいことがあるかもしれません。

以下のように、変数の数を減らし、カウントアップ方式からカウントダウン方式に することによってより高速化を望めます。ただ、これはどの言語でも言えることですが、 速度を求めすぎたコードは可読性が下がりがちになるので、そのプロダクトに 求められるものを考えながらトレードオフで使い分ければいいかと思います。


var i,
    myarray = [];

for ( i = myarray.length; i--;){
    //...
}