2

私はブラウザで非常に多くのデータを処理する作業を行っています。その結果、私はすべてをナットとボルトに至るまで最適化しようとしています。私は自分の時間を無駄にしている、あるいは時期尚早の最適化がすべての悪の根源であると私に言う人はいらない。どのブール値がより高速ですか? <または<=

JSの仕組みを理解している誰かが、ブール値がブール値よりも小さいかどうかがブール値よりも小さいかどうかを知ることができるかどうかを知りたいだけです。私はそれによって意味することは、考えている:

return (i<2? 0:1) 

解析され、より速くよりも実行されます。この例では

return (i<=1? 0:1) 

我々は、iは整数であると仮定しています。ありがとう。

+0

違いはほとんどありませんが、https://jsperf.comでご確認いただけます。 – andlrc

+1

JSPerfはほぼ1年間ダウンしています。私のテストでは、それ以上のスピードは速いものの、それは変動する傾向があるので、私は完全にはわかりません。 –

+1

テストケースをいくつかの数字に含めて、質問が他のものよりも速いのかどうかということではなく、*なぜ*高速であるのかを明確にする必要があります。 – TankorSmash

答えて

2

評価するために取られる必要がある手順をdesribes JavaScriptの標準それらの表現。 ECMAScript 2015 Language Specificationのセクション12.9.3をご覧ください。

これらの2つの操作のステップに若干の違いがあっても、アプリケーション内の他のものは、JavaScriptで制御できない単純な操作ほどパフォーマンスに大きな影響を及ぼすことに注意してください。ガベージコレクタ、ジャストインタイムコンパイラの仕事の例...

JavaScriptで時間を計測しようとしても、タイムスタンプを取るだけでは実際の式よりもパフォーマンスに大きな影響がありますあなたは測定したい。また、あなたが書いたコードは、コードを実際に実行する前にエンジンによって取り込まれたかもしれないいくつかの事前最適化として実際に評価されるものではないかもしれません。

+0

うわー、それは素晴らしい答えです、ありがとう! –

1

performance.now APIとconsole.time APIの を使用してフィーリングを作成しました。両方のAPIは、機能/ループの実行にどれだけ時間がかかったかを示しています。 私は大きな違いが結果であると感じます、performance.nowはより正確な値すなわち1/1000ミリ秒まで与えます。

https://jsfiddle.net/ztacgxf1/

function lessThan(){ 
    var t0 = performance.now(); 
    console.time("lessThan"); 
    for(var i = 0; i < 100000; i++){ 
     if(i < 1000){} 
    } 
    console.timeEnd("lessThan"); 
    var t1 = performance.now(); 
    console.log("Perf -- >>" + (t1-t0)); 
} 
function lessThanEq(){ 
    var t0 = performance.now(); 
    console.time("lessThanEq") 
    for(var i = 0; i < 100000; i++){ 
     if(i <= 999){} 
    } 
    console.timeEnd("lessThanEq"); 
    var t1 = performance.now(); 
    console.log("Perf -- >>" + (t1-t0)); 
} 
lessThan() 
lessThanEq() 

私はあまり差はない持っています。より多くの反復が異なる結果をもたらすかもしれない。

希望すると、これが役立ちます。

2

私はこのマイクロ最適化ではなく、ナノ最適化と呼んでいます。
ケースが...あなたが最も可能性の高いあなたが期待することができ、利得以下の測定精度を持っていますので、似ている

このコードが最適化されている場合は、生成されたアセンブリコードはちょうど(JATO JAEから変更されます
(編集) (x86の)中で、彼らは同じサイクル数を使用しています。0,0000%の変化を。そうでない場合は
、あなたは迷惑なものはそれということで

エンジンのselect内の一歩を...勝つかもしれません私が間違っていない限り、あなたはここに支店が必要です。そして、あなたが時間を心配しているなら、あなたの入力の統計的分布はより多くのエグゼクティブに影響を与えます定刻。 (まだないというくらい...)

だから、バックステップを歩くと比較:

if (i<2) 
    return 0; 
else 
    return 1; 

と:

if (i>=2) 
    return 1; 
else 
    return 0; 

あなたは(100、20、10のためのことがわかり、1 、50、10)(1)は(0,1,0,0,20,1)に対してより分岐し、(2)はより分岐します。
それはずっと多くの違いをもたらすでしょう...それは測定するのが非常に難しいかもしれません!

(私は読者に残された質問として、どのようにreturn +(i>1)がコンパイルされているのだろうと思っています。また、分岐を避けるためのトリックがあれば...)

それはあなたが興味可能性がある場合(私は早期に最適化反対ではないよちなみに、私も、ここにいくつかのアドバイスを掲載:https://gamealchemist.wordpress.com/2016/04/15/writing-efficient-javascript-a-few-tips/

+0

ハハ、ナノ最適化 –

関連する問題