IT

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

itgroup 2022. 10. 19. 22:12
반응형

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

?는 왜?=== ==PHP ★★★★★★★★★★★★★★★★?

연산자 '는 등가 연산자 '는 등가 연산자'이기 입니다.== 타입이하기 위해 타입을합니다.===(아이덴티티 연산자)는 변환을 전혀 할 필요가 없기 때문에 작업이 적기 때문에 고속화됩니다.

===는 타이프캐스팅을 않기 때문에, 「타자캐스팅」을 실시하지 .0 == '0'true0 === '0' (으)로false.

다음 두 가지 사항을 고려해야 합니다.

  1. 경우는, 「다르다」를 참조해 주세요.== ★★★★★★★★★★★★★★★★★」===다른 결과를 낳다이 경우 연산자의 속도는 중요하지 않습니다.중요한 것은 어느 쪽이 원하는 결과를 낳느냐입니다.

  2. 피연산자 할 수 .== ★★★★★★★★★★★★★★★★★」===둘 다 같은 결과를 낳기 때문입니다.이 경우 두 연산자의 속도는 거의 동일합니다.이는 두 연산자 모두 유형 변환을 수행하지 않기 때문입니다.

속도를 비교했습니다.

  • $a == $b »$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

속도가 거의 같은 것을 알 수 있습니다.

먼저 ===는 두 인수가 동일한 유형인지 확인합니다. 따라서 실제로 비교가 수행되기 전에 형식 검사에서 숫자 1과 문자열 '1'이 실패합니다.반면 ==는 먼저 유형을 확인하지 않고 두 인수를 동일한 유형으로 변환한 다음 비교합니다.

따라서 ===가 고장 상태를 더 빨리 확인합니다.

상당히 빠를지는 모르겠지만, 대부분의 언어에서 ===는 직접적인 유형 비교이며, ==는 필요에 따라 유형 강압을 시도하여 일치시킵니다.

==는 비교하기 전에 유형 변환의 오버헤드를 더 많이 유발합니다.===는 먼저 유형을 확인한 후 유형 변환 없이 계속 진행합니다.

★★★★★★★★★★★★★★★★★★=== 비교하기 전에 오퍼랜드가 같은 타입이 되도록 강제할 필요는 없습니다.

하지만 속도 차이가 많이 나는 건 아닐 거예요.통상적인 상황에서는 어느 연산자를 사용하는 것이 좋습니다.

결론적으로 ===은(는) 데이터 유형을 변환하여 두 변수의 값이 동일한지 확인해야 하므로 더 빠릅니다. 그러나 두 변수의 값이 동일한지 확인해야 할 때는 어떤 유형의 변수인지 파악하지 못하면 ==를 사용하거나, 변수의 유형도 중요한 경우에는 ===를 사용합니다.

실제로 두 운영자 간에 상당한 속도 차이가 있다는 것을 알게 되었습니다.아래 도커 컨테이너에서 실행 중인 php 8.0.0 RC5 및 php 7.4.12의 결과입니다.이 프로젝트는 기트허브에서 호스트되므로 모든 사람이 방법론을 검토할 수 있습니다.면책사항:제가 도구를 만들었어요.

$ php src/benchmark.php --custom --filter ~equal~
PHP benchmark

-------------------------------
platform           :  Linux x64
php version        :     7.4.12
xdebug             :        off
memory limit       :       128M
max execution      :          0
time per iteration :       50ms
iterations         :        100
-------------------------------
---------------------------------------------------
0                  :         ==       ===
mean               :     394156    459015    +16.5%
median             :     397448    461822    +16.2%
mode               :     398154    458062    +15.0%
minimum            :     313271    405692    +29.5%
maximum            :     411157    480360    +16.8%
quartile 1         :     393222    454952    +15.7%
quartile 3         :     400881    466491    +16.4%
IQ range           :       7659     11538    +50.7%
std deviation      :      15593     11867    -23.9%
normality          :       0.8%      0.8%
---------------------------------------------------

$ php src/benchmark.php --custom --filter ~equal~
PHP benchmark

-------------------------------
platform           :  Linux x64
php version        :   8.0.0RC5
xdebug             :        off
memory limit       :       128M
max execution      :          0
time per iteration :       50ms
iterations         :        100
-------------------------------
---------------------------------------------------
0                  :         ==       ===
mean               :     405032    474768    +17.2%
median             :     409226    477313    +16.6%
mode               :     408421    479741    +17.5%
minimum            :     311606    386509    +24.0%
maximum            :     417895    491842    +17.7%
quartile 1         :     405740    473436    +16.7%
quartile 3         :     412677    483139    +17.1%
IQ range           :       6937      9703    +39.9%
std deviation      :      17501     15657    -10.5%
normality          :       1.0%      1.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_)

테스트 결과가 정확하다면 컴파일러의 문제일 것입니다.

프로세서는 클럭 사이클에 따라 지시된 모든 작업을 수행합니다.

할 일이 적으면 하는 것이 더 빠를 것이다.

추가:

아, 실제로 컴파일러가 처리할 기계 코드를 이미 많이 만들고 있다면, 비교해야 할 데이터 유형에 대응하기 위해 수많은 데이터를 이미 추가했다면, 하나의 "작은" IF를 제거해도 속도는 크게 변하지 않습니다.

만약 누군가가 여전히 이것을 읽는다면 나는 더 많은 토론에 흥미가 있다.

언급URL : https://stackoverflow.com/questions/2401478/why-is-faster-than-in-php

반응형