PHPで===が==より速いのはなぜですか?


168

なぜPHP ===より速いの==ですか?


40
高速ですが、かなり高速ですか?
Piskvorは

19
phpで何が速いかについては読んではいけません。JOINを悪用せずに1つのSQLクエリで興味深いデータを取得する方法について読んでください。
Kamil Szot

15
誰にそれは同じ主題に興味があるかもしれません=== vs ==が、JavaScriptで、ここで読むことができます:stackoverflow.com/questions/359494/...
マルコDemaio

5
@Piskvor、それは問題ではありません
Pacerier 2013

6
@Pacerier:フェアポイント-これが私がこれについてコメントした理由です。それは質問には答えませんが、それについての展望を提供します。
Piskvorは、2014

回答:


200

等値演算子==はデータ型を一時的に強制または変換するため、他のオペランドと等しいかどうかを確認しますが、===(識別演算子)は変換を一切行う必要がないため、実行される作業が少なくなり、高速化されます。


あなたの意見は、PHPマニュアルの内容に反していると思います。彼らは、$ aが$ bと等しい場合、$ a == $ bはTRUEであると言います。ここで、$ a === $ bは、$ aが$ bと等しい場合、TRUEであり、同じタイプです。
Bakhtiyor 2010年

92
それでは、それはどのように反対ですか?
meder omuraliev 2010年

2
実際には、2つのオペランドが複雑な型の同じメモリ領域を指していると思いますが、メダーの答えはそれを網羅しています
基本的な

1
これは理にかなっています(JSの場合と同様)が、誰かが実際の単純なパフォーマンステストへの参照も追加するとよいでしょう。
Marco Demaio、2010

4
phpbench.comの「制御構造」セクションに、==と===のパフォーマンスの違いが示されています。
ekillaby 2013

54

===型キャストを実行しないため、に0 == '0'評価されますtrueが、0 === '0'-に評価されfalseます。


25

まず、===は2つの引数が同じかどうかを確認します。したがって、実際に比較が実行される前に、型の確認で数値1と文字列 '1'が失敗します。一方、==は最初に型をチェックせず、先に進み、両方の引数を同じ型に変換してから比較を行います。

したがって、===は、障害状態のチェックが高速です。


8
私は推測したい==任意の型変換を行う必要があるかどうかを確認するために最初にもチェックにタイプを。===次のステップで変換を行わないという事実は、それをより速くするものです。
だます

25

考慮すべき点が2つあります。

  1. オペランドのタイプが異なる場合==結果===異なります。その場合、オペレーターの速度は重要ではありません。重要なのは、どれが望ましい結果を生み出すかです。

  2. オペランドのタイプが同じ場合は、どちらか一方を使用する=====、両方を使用しても同じ結果が得られるためです。その場合、両方のオペレーターの速度はほぼ同じです。これは、どちらの演算子でも型変換が行われないためです。

私は以下の速度を比較しました:

  • $a == $b$a === $b
  • ここで$a$bランダムな整数[1、100]
  • 2つの変数が生成され、100万回比較されました
  • テストは10回実行されました

そしてここに結果があります:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

速度はほぼ同じであることがわかります。


13
他に何も実行していないマシンで数十億回の反復を実行し、平均を出力するとどうなるでしょうか。ここにはかなりのノイズがあるようです。;)
Gung Foo

4
私は同じ結論に達しました。オペランドが同じ型のものであることがわかっている場合、違いは測定できません。他のシナリオでは意味がありません。他のほとんどすべての答えは間違っています。
ポールスピーゲル

1
私はこれが選ばれた答えであるべきだったと思います。それは単に仮定を用いて合理化するだけではなく、仮定は経験的に多かれ少なかれテストされました。
Pedro Amaral Couto 2018年

@PedroAmaralCouto 10は経験的な研究ではないので、私はそうは思いません。違いがほとんどない主な理由は、PHPコンパイラーがおそらくコードを最適化することです。型変換が必要でない限り、===を使用する必要があります。これは、意味エラーを減らすのに役立ちます(たとえそれが一生に一度であっても)。また、次の人がコードを読んで、どのルールが適用されているかも確認できます。あなたは一度書いて、それを数百回読みます、もしそれが一人の疑いを解決するのを助けることができれば、それはすでに成功しています。同じタイプにクローンを作成するため、経験的であればメモリテストもありません。時間よりも多くのリソースがあります。
Marco

@マルコ、私が「経験的研究」と言うとき、私はそれが経験に基づいていることを意味します。サルマンAの値は、===が同等に時々少し速く、時には少し遅いことを示唆しています。これは、「PHPで=== ==より速いのはなぜですか?」「===が==より速いことをどうやって知っているのですか?」コンパイラーの最適化は説明であり、何が速くて遅くなるかではなく、何を使用すべきかは述べていません。
Pedro Amaral Couto

7

大幅に高速であるかどうかは本当にわかりませんが、===はほとんどの言語で直接型を比較しますが、==は必要に応じて、または一致する可能性がある場合は型強制を試みます。


9
JavaScriptには===演算子があります。
フランクShearar

一般的なlispとスキームで===を実行できると確信しています。
プペノ2010年

Javascript-私がチェックした3つの言語の定義ではありません;)LispとSchemeは多くのものですが、ほとんど一般的ではありません;)
TomTom

1
ルビーには===があります。私が同じことをするかどうかを覚えるのはあまりにも長い間です。
KitsuneYMG 2010年

1
また、livescript.adobe.com / flash / 9.0 / ActionScriptLangRefV3 /…(actionscriptの場合)。基本的には、グーグル「厳密な平等」。
Chris

4

==では、比較前に型変換のオーバーヘッドが大きくなります。===最初に型をチェックし、次に型変換を行わずに処理を進めます。



3

結論として、2つの変数の値が同じかどうかを確認するためにデータ型を変換しないため、===の方が高速ですが、2つの変数の値が同じかどうかを確認する必要がある場合は、==を使用します。 、または===変数のタイプも重要である場合。


0

高速は、直接実行時間で測定されるだけではありません(この場合、直接パフォーマンステストはほとんど無視できます)。とは言っても、(現実的なコンテキストで使用した場合)累積的な有意差があるかどうかを実際に確認するには、反復または再帰を含むテストを行う必要があります。エッジケースを処理するときに節約できるテストとデバッグの時間は、あなたにとっても意味があるはずです


0

php(cコード)では、値は次のような「クラス」です。

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

あなたが比較$a == $b$aintタイプしているとき、次のようなものがあります:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

しかしstring '1'、ASCIIコード49にキャストされません1

あなたが比較$a === $b$aintタイプであるとき、次のようなものがあります:

if ($a->int_ == $b->int_)

-4

テスト結果が正しい場合は、コンパイラの問題である必要があります。

プロセッサは、クロックサイクルで実行するように指示されたすべてを実行します

それを行うことが少ない場合は、それを行うのがより速くなります

添加:

ええと、コンパイラーが処理するマシンコードのロードをすでに作成している場合は、比較する必要があるデータのタイプに対処するために何十億もの要素がすでに追加されている場合、1つの「マイナー」IFを削除しても速度はあまり変わりませんまったく。

まだ誰かがこれを読んでいるなら、私はより多くの議論で興味深いです。

フィル


コードベースに「1つ」のIFステートメントしかありませんか?私が取り組んだすべてのコードベースで、何千ものIFまたは比較ステートメントがどこでも呼び出されているので、それは奇妙です。
Lev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.