0

このテストでは、関数式の2つの異なる方法を調べています。感嘆符の単項演算子と角かっこを使用します。

以下は2つのテストです。

var f = !function() {};

var f = (function() {});

以下の結果を考えると、単項演算子のテストがFirefoxのブラケットテストよりも約5261%速いことを知ったとき、私は興味をそそられました。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

どのような種類の最適化が行われているので、Firefoxのパフォーマンスが大幅に向上し、他のブラウザよりも小さくなりますか?

4

3 に答える 3

3

最初のものは結果にbooleanなり、2番目のものはaになりfunctionます。あなたのテストには、現実世界での重要性はあまりないようです。

「どのような最適化が行われているので、Firefoxのパフォーマンスが大幅に向上し、他のブラウザよりも小さくなりますか?」

Firefoxには、実際には使用されないため、関数オブジェクトの作成を回避する最適化があると思いますが、それは単なる推測です。


これが更新されたjsPerfです。これは、ブール値を作成する2つのテストを追加します。Firefoxの「Exclamation」テストに非常に近いことに注意してください。

これは、Firefoxがこの特定の最適化を備えているという考えをサポートします。

于 2012-09-23T19:47:48.700 に答える
0

これをより「現実的な」例に入れると、違いはもはやそれほど重要ではなくなります。

これらの式は、グローバルコンテキストからコードをカプセル化するための外部関数コンテキストを作成するために使用される可能性があります。

!function() {
}();

(function() {
}());

ここでその結果を参照してください:http://jsperf.com/function-expressions/2

あなたは実際にそこでエンジンの仕事を2倍にします。ただし、変数に関数を割り当てると、暗黙的に関数式が作成されます

var f = function() {};

また、!演算子を適用することは、不要な作業です。

于 2012-09-23T19:45:35.953 に答える
0

「感嘆」の場合、1秒あたり約1e9の操作が発生します。お使いのCPUは、おそらく1秒あたり約1〜40億クロックティックを実行します。そのため、ケースは約1〜4クロックティックかかります。

つまり、JITによって全体が「f=false」に最適化されたということです。おそらく、型推論がその単項「!」を検出したためです。常にオブジェクトが続き、「false」に最適化されます。

Chromeで遅い理由の1つは、Chromeには単項「!」のオブジェクトがあるためです。trueを返すため、上記で説明した最適化は無効です。

于 2012-09-24T18:36:01.093 に答える