2012-07-20 4 views
7

私は本当に調べる機会がなかったという簡単な質問。コールで使用されたときにより効果的です/文脈の適用:Array.prototype[]Array.prototype vs [] perf

例えば:

function test1() { 
    return Array.prototype.splice.apply(arguments, [1, 2]); 
} 

test1([1,2,3,4,5,6,7,8,9]); 

function test2() { 
    return [].splice.apply(arguments, [1, 2]); 
} 

test1([1,2,3,4,5,6,7,8,9]); 

私の考え:私はプロトタイプの機能を再利用することができ、何のリテラル必要が作成されないことがあるためArray.prototype方法がよりパフォーマンスであると仮定します。しかし確かに確信しています。 (クローム付き)JSPerfを使用して

Array.prototypeは確かに少しよりパフォーマンスであるように見えます:

http://jsperf.com/array-perf-prototype-vs-literal

+0

リストされている理由により、 'Array.prototype.splice'がより速くなると思います。余分なオブジェクトの作成はありません。しかし、これはせいぜいマイクロ最適化であり、このような状況での可読性に焦点を当てる必要があります。 – Matt

+0

* agree *あなたの意見ではどれが読みやすくなっていますか?私はArray.prototypeに傾きますが、libsなどで使用されている[]を見ています。 –

+0

Dpolehonskiがバイト数の削減についての彼の答えの良い点を作っていますが、私はそれにも 'Array.prototype'と同意します'[]'を使うときは私はどちらのアプローチの利点もそれほど重要ではないと思うので、他の何よりも個人的な好みに沸きます。 – Matt

答えて

3

それはそれを実行しているブラウザによって異なります。クロムでは、.prototypeが速いと思われますが、一般的にクロムよりも遅く実行されますが、firefoxはこの2つの間に違いはありません。 IE9は.prototypeの速度が大幅に向上していますが、これまでのところ最も遅いブラウザです。

しかし、このような最適化は非常に小さいので、保存された時間はコードを読み取るために必要な余分なバイト数と相殺されると主張することができます。私は逃げ出しますが、これがあなたにとって最大のパフォーマンス上の問題であれば、あなたは本当に最適化に問題はありません!

EDIT:

私はIE、ChromeとFirefoxの両方ともより速くとして現れたスプライス関数を呼び出す関数に渡された配列を使用する余分なテストhereを加えました。 私の結論は、すでに配列を手軽に利用している場合はそれを使用し、それ以外の場合はプロトタイプを使用します。

+0

本当に有益なコメントありがとう!配列fnキャッシュの考え方は賢明です。私は別のブラウザで改訂を試みたが、同じ結論に達した、それはブラウザのJSエンジンに依存する。また、マイクロ最適化について合意しました。私のperf問題の大半はDOMのやりとりに由来しています。 –

関連する問題