33

数週間前、私はこのスレッドを読みました<=よりも速いですか?の比較演算子についてC。とは同じ/類似のマシンコマンドとして解釈されるため、パフォーマンスに違いはないと言われてい<ます。<=

同時に、当社の「ベストプラクティス」では、「==」の代わりに「===」を使用して比較する必要があると言われていました。それで、私は「==」と「typeof ... ==」を使用することに慣れていて、私の書き方を変えたくないので、これが常に適切であるかどうか疑問に思い始めました:-]

これはJavaScriptのコンテキストであることに注意してください。

だから、私は少し研究をしています、そしてここでJavaScriptの比較で使用されるべき演算子(== vs ===)はどれですか?と言われている:

これは、等式演算子==が型強制を行うためです...つまり、インタープリターは暗黙的に値の変換を試みてから、比較を行います。

一方、恒等演算子===は型強制を行わないため、比較時に値の値を変換しません。

そして、これは、「===」演算子を使用すると、オペランドの変換にリソースが費やされないため、良好なパフォーマンスが得られることを意味するのではないかと思い始めました。そして、すべてのコードがマシンコマンドに変換された後、これは、とCを使用するときに違いがないのと同じように、JavaScriptや他の言語でも同じであることを意味しますか?<<=

4

6 に答える 6

23

簡単に検証できる証拠を持った答えが最善だと思います。

これらの操作は非常に小さいため、パフォーマンステストを行うことは困難です。

  • ==1648真
  • === 1629 true
  • コントロールテスト1575true

コントロールテストを差し引くと、私のブラウザでは速度に最大30%の違いがあるように見えます。これを複数回行うと、さまざまな答えを得ることができますが、通常、===が最も速く表示されます。これは、違いがどれほど無視できるかを示す証拠にすぎないと思います。

これは、他の人が言っていたことをほぼ証明していると思います。パフォーマンスの違いは考えるのに時間の無駄ですが、===の方が実際には速いことも示しています。うまくいけば、この答えが他の人々、単に証拠を見なければならない人々の時間を節約することができます。

2019アップデート

2019-04-09テストが改善されたFirefox:

  • ==1383真
  • === 1167 true
  • コントロールテスト429true

2019-04-09テストが改善されたChrome:

  • == 249 true
  • ===248真
  • コントロールテスト248true

2019-04-09テストが改善されたエッジ:

  • == 22510 true
  • === 20315 true
  • コントロールテスト4968true

ブラウザは何年にもわたってよりスマートになり、私の元のテストはChromeとFirefoxのクールな最適化にぶつかり、もはや役に立たなくなったようです。テストの最適化をより困難にし、実行回数を増やして、意味のある結果を再度取得しました。 ===は全体的にまだ高速のようです。心配するのはおそらくまだ時間の無駄です。

var testString = "42";
var testString2 = "43";
var testString3 = "42";
var testNumber = 42;
var testNumber2 = 43;
var testNumber3 = 42;

var testObject = {};
var testObject2 = {};
var testObject3 = testObject;


var start = Date.now();
var result = null;
for(var i = 0; i < 200000000; i++){
	result = 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString2 || testNumber == testNumber2 || testObject == testObject2 || 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3 && 
	testString == testString3 && testNumber == testNumber3 && testObject == testObject3
}

console.log("==", Date.now() - start, result);

var start = Date.now();
var result = null;
for(var i = 0; i < 200000000; i++){
	result =
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString2 || testNumber === testNumber2 || testObject === testObject2 || 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3 && 
	testString === testString3 && testNumber === testNumber3 && testObject === testObject3
}
console.log("===", Date.now() - start, result);
var start = Date.now();
var alwaysTrue = true;
var alwaysFalse = false;
for(var i = 0; i < 200000000; i++){
	result = 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysFalse || alwaysFalse || alwaysFalse || 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue && 
	alwaysTrue && alwaysTrue && alwaysTrue
}
console.log("control test", Date.now() - start, result);

于 2016-08-22T19:52:22.857 に答える
16

まず、パフォーマンスは単に問題ではありません。実際のスクリプトの場合、一方の演算子をもう一方の演算子よりも使用することによるパフォーマンスの向上は、コード内の他のボトルネックと比較して非常に小さくなります(通常、DOM操作が最大のターゲットになります)。

第二に、多くの場合、まったく同じ手順=====実行します。2つのオペランドのタイプが同じである場合(たとえば、2つの文字列または2つの数値)、ECMAScript仕様は2つの演算子に対してまったく同じステップを持ちます。したがって、あるブラウザまたは他の環境で同じタイプのオペランドの2つの演算子のパフォーマンスの違いを観察した場合、別のブラウザでも同様の違いが見られることは保証されておらず、可能性もありません。

の場合typeof、あなたの質問で述べたように、2つのオペランドは同じタイプ(文字列)であることが保証され、両方の演算子はまったく同じことを行うため、一方の演算子を他方よりも優先する唯一の理由はスタイルです。

JSコミュニティは全体として、これについてかなり厳しい状況にあります。コンセンサスは「決して使用==!=ないで、型強制が必要でない限り」のようです。これは私の好みにはあまりにも独断的です。

于 2012-09-25T12:10:32.667 に答える
3

どのようなパフォーマンスが得られるかは問題ではありませんが===、この場合は明らかに優れた選択肢です。より良いパフォーマンスのような他の何かは、ケーキの上のアイシングです。その上、どちらの方法でも違いは最小限です。

于 2012-09-11T17:24:06.807 に答える
3

これはスクリプト言語です。これらの演算子のパフォーマンスはそれほど重要ではないので、心配する必要はありません。仮想マシンで実行され、型が弱く、HTMLで動作するなど、より多くの電力を消費するものが他にもたくさんあるからです。ブラウザ内のDOM...

さらに、両方の演算子はまったく異なることを行うため、いずれの場合も一方を他方と交換できない可能性があります。

===そうは言っても、私はそれがより速いと思います(しかしテストしていません) 。その理由は、タイプを比較するだけでよく、一致する場合は生データを比較するためです。==一致しない場合、オペレーターはあるタイプを別のタイプに変換しようとします。ほとんどの場合、これはよりコストのかかる操作になります。

そしてそれは幸運なことです。ほとんどの場合===、より良い選択肢だからです。:)

とにかく、簡単にテストできます(同じタイプといくつかの異なるタイプの両方で複数のケースをテストするようにしてください)が、テスト方法がわからない場合は、まったく心配する必要はありません。違いがあったとしても、あなたを殺すことはありません。

于 2012-09-11T17:25:31.907 に答える
2

パフォーマンスの違いはごくわずかです。つまり、貴重な脳のサイクルを無駄にしないでください。ただし、本当に知りたい場合は、テストする必要があります。

使用===しない大きな理由がない限り(おそらく使用しないでください)使用してください。

于 2012-09-11T17:24:39.253 に答える
-4

jsの場合、文字列タイプで使用され、文字列がまったく同じ文字である場合、===演算子はtrueを返します。オブジェクトの場合、コンテンツではなく、オブジェクト参照を比較します。

ECMA標準から:

11.9.6厳密な等式比較アルゴリズム比較x===y(xとyは値)は、trueまたはfalseを生成します。このような比較は次のように実行されます。

  1. Type(x)がType(y)と異なる場合は、falseを返します。
  2. Type(x)がUndefinedの場合、trueを返します。
  3. Type(x)がNullの場合、trueを返します。
  4. Type(x)がNumberの場合、a。xがNaNの場合、falseを返します。b。yがNaNの場合、falseを返します。c。xがyと同じ数値である場合、trueを返します。d。xが+0でyが-0の場合、trueを返します。e。xが-0で、yが+0の場合、trueを返します。f。falseを返します。
  5. Type(x)がStringの場合、xとyがまったく同じ文字シーケンス(対応する位置で同じ長さと同じ文字)であればtrueを返します。それ以外の場合は、falseを返します。
  6. Type(x)がブール値の場合、xとyが両方ともtrueまたは両方がfalseの場合はtrueを返します。
于 2012-09-11T17:26:39.987 に答える