PHP에서 ===가 ==보다 빠른 이유는 무엇입니까?


168

PHP ===보다 왜 ==빠릅니까?


40
더 빠르지 만 훨씬 더 빠릅니까?
Piskvor

19
PHP에서 더 빠른 것에 대해서는 읽지 마십시오. JOIN을 남용하지 않고 단일 SQL 쿼리에서 흥미로운 데이터를 얻는 방법에 대해 읽으십시오.
Kamil Szot

15
누구에게 동일한 주제에 관심이있을 수도 === vs ==있지만, 자바 스크립트, 여기 읽을 수 있습니다 : stackoverflow.com/questions/359494/...
마르코 Demaio

5
@Piskvor, 그건 문제가 아닙니다
Pacerier

6
@Pacerier : 공정한 요점-이것이 내가 이것에 대해서만 언급 한 이유입니다. 그것은 질문에 대답하지 않지만 그것에 대한 관점을 제공합니다.
Piskvor는 건물을

답변:


200

항등 연산자 ==는 데이터 유형이 일시적으로 다른 피연산자와 같은지 확인하기 위해 데이터 유형을 강제하거나 변환 하기 때문에 ===(ID 연산자)는 변환을 수행 할 필요가 없으므로 작업이 줄어 더 빨라집니다.


귀하의 의견은 PHP Manual의 내용과 반대되는 것 같습니다. $ a가 $ b와 같으면 $ a == $ b는 TRUE라고합니다. $ a가 $ b와 같으면 $ a === $ b는 TRUE이며 동일한 유형입니다.
Bakhtiyor

92
그렇다면 어떻게 상반 되는가?
meder omuraliev

2
나는 실제로 두 피연산자가 복잡한 유형에 대해 동일한 메모리 영역을 가리킨다 고 생각하지만 meder의 대답은 다음을 포함합니다.
Basic

1
JS에서와 같이 의미가 있지만 누군가 실제 간단한 성능 테스트에 대한 참조를 추가하면 좋을 것입니다.
Marco Demaio

4
phpbench.com 의 "Control Structures"섹션에서 ==와 ===의 성능 차이를 나타냅니다.
ekillaby

54

===, 타입 캐스팅을 수행 그렇게하지 않는 0 == '0'로 평가 true하지만 0 === '0'-에 false.


25

두 인수가 같은 경우 첫째, === 확인합니다 유형을 - 어떤 비교가 실제로 수행되기 전에 숫자 1과 문자열 '1'유형 검사에 실패 있도록. 반면, ==는 먼저 유형을 확인하지 않고 두 인수를 동일한 유형으로 변환 한 다음 비교를 수행합니다.

따라서 ===는 실패 조건을 확인하는 데 더 빠릅니다.


8
==유형 변환을 수행 해야하는지 확인하기 위해 유형을 먼저 확인 한다고 생각합니다 . 사실 ===다음 단계에서 어떤 변환을 수행하지 않습니다 빨리 그것을 만드는 것입니다.
deceze

25

고려해야 할 두 가지가 있습니다.

  1. 피연산자 유형은 다른 경우 =====생산 다른 결과를 . 이 경우 작업자의 속도는 중요하지 않습니다. 중요한 것은 원하는 결과를 생성하는 것입니다.

  2. 피연산자 유형이 동일하면 둘 중 하나 ==또는 ===둘 다를 사용 하여 동일한 결과 를 생성 할 수 있습니다 . 이 경우 두 연산자의 속도는 거의 동일합니다. 두 연산자 중 하나에 의해 형식 변환이 수행되지 않기 때문입니다.

나는 속도를 비교했다.

  • $a == $b vs $a === $b
  • 어디서 $a그리고 $b임의의 정수 [1, 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
다른 작업을하지 않고 평균을 출력하는 컴퓨터에서 약 10 억 회 반복하면 어떻게 될지 궁금합니다. 여기에 소음이 많은 것 같습니다. ;)
Gung Foo

4
나는 같은 결론에 이르렀다. 피연산자가 같은 유형의 것으로 알려진 경우 아무런 차이도 없습니다. 다른 시나리오는 영향을 미치지 않습니다. 거의 모든 다른 답변은 잘못되었습니다.
Paul Spiegel

1
나는 이것이 선택된 대답이어야한다고 생각합니다. 그것은 단지 가정과 합리적이지 않으며, 가정은 실험적으로 테스트가 덜 이루어졌다.
Pedro Amaral Couto

@PedroAmaralCouto 10은 경험적 연구가 아니기 때문에 그렇게 생각하지 않습니다. 거의 차이가없는 주된 이유는 PHP 컴파일러가 아마도 코드를 최적화 할 것이기 때문입니다. 타입 변환이 필요하지 않은 한 ===를 사용해야합니다 (전체 수명에 한 번이라도 의미 론적 오류를 줄이는 데 도움이됩니다). 또한 다음 규칙이 적용되는 규칙을 읽는 사람에게 도움이됩니다. 한 번만 쓰고 몇 백 번 읽습니다. 한 사람의 의심을 없애는 데 도움이된다면 이미 성공한 것입니다. 또한 동일한 유형으로 복제되므로 경험적 경우 메모리 테스트가 없습니다. 시간보다 더 많은 자원이 있습니다.
Marco

@Marco, "임시 연구"라고 말할 때, 그것은 경험에 근거한다는 것을 의미합니다. Salman A 값은 ===가 때때로 조금 더 빠르며 때로는 조금 느리다는 것을 나타냅니다. 이것은 "왜 PHP에서 === ==보다 빠릅니까?" "===가 =="보다 빠르다는 것을 어떻게 알 수 있습니까? 컴파일러 최적화는 더 빠르거나 느린 것이 아니라 설명이며 사용해야 할 것을 말하지 않았습니다.
페드로 아마 랄 쿠토

7

나는 그것이 훨씬 빠르다는 것을 실제로 알지 못하지만, 대부분의 언어에서 ===는 직접 유형 비교이며, ==는 필요한 경우 / 일치를 얻기 위해 유형 강제를 시도합니다.


9
자바 스크립트에는 === 연산자가 있습니다.
Frank Shearar

일반적인 lisp과 scheme에서 ===를 할 수 있다고 확신합니다.
pupeno

Javascript-내가 정의한 3 개의 언어 정의가 아님;) 그리고 Lisp와 Scheme은 많은 것들이지만 거의 일반적이지 않습니다;)
TomTom

1
루비에는 ===가 있습니다. 그것이 같은 일을하는지 기억하기에는 너무 오래되었습니다.
KitsuneYMG

1
또한 actionscript에 대해서는 livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… 를 참조하십시오. 기본적으로 구글 "엄격한 평등".
Chris

4

==는 비교 전에 유형 변환의 오버 헤드가 더 큽니다. === 먼저 형식을 확인한 다음 형식 변환을 수행하지 않고 진행합니다.



3

결론적으로 두 변수의 값이 같은지 확인하기 위해 데이터 유형을 변환하지 않기 때문에 ===가 더 빠르지 만 두 변수의 값이 같은지 확인해야 할 경우 ==를 사용하면 어떤 유형이 변수인지 계산할 수 없습니다 또는 === 변수가 중요한 경우에도 중요합니다.


0

직접 실행 시간으로 더 빨리 측정해서는 안됩니다 (이 경우 직접 성능 테스트는 거의 무시할 수 있음). 즉, 반복적 또는 재귀와 관련된 테스트를 통해 상당한 누적 차이 (실제 상황에서 사용되는 경우)가 있는지 확인해야합니다. 엣지 케이스를 다룰 때 절약 할 수있는 테스트 및 디버깅 시간도 중요합니다.


0

PHP (c 코드)에서 value는 다음과 같은 "클래스"입니다.

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유형을, 같이가 someting있을 것입니다 :

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

-4

테스트 결과가 정확하면 컴파일러 문제 여야합니다.

프로세서는 클럭 사이클에서 수행하도록 지시받은 모든 작업을 수행합니다.

할 일이 적 으면 더 빨리 할 것입니다

덧셈:

아 실제로는 컴파일러가 처리 할 머신 코드를 이미 생성 한 경우 어떤 유형의 데이터를 비교해야하는지에 대해 수십억 개의 항목을 이미 추가 한 경우 하나의 "사소한"IF를 제거하면 속도가 크게 변하지 않습니다. 조금도.

누군가가 여전히 이것을 읽는다면 나는 더 많은 토론에서 흥미 롭습니다.


코드베이스에 "하나의"IF 문만 있습니까? 내가 작업 한 모든 코드 기반에서 수천 개의 IF 또는 비교 문이 모든 곳에서 호출되기 때문에 이상합니다.
Lev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.