PHP에서 ===가 ==보다 빠른 이유는 무엇입니까?
?는 왜?===
==
PHP ★★★★★★★★★★★★★★★★?
연산자 '는 등가 연산자 '는 등가 연산자'이기 입니다.==
타입이하기 위해 타입을합니다.===
(아이덴티티 연산자)는 변환을 전혀 할 필요가 없기 때문에 작업이 적기 때문에 고속화됩니다.
===
는 타이프캐스팅을 않기 때문에, 「타자캐스팅」을 실시하지 .0 == '0'
true
0 === '0'
(으)로false
.
다음 두 가지 사항을 고려해야 합니다.
경우는, 「다르다」를 참조해 주세요.
==
★★★★★★★★★★★★★★★★★」===
다른 결과를 낳다이 경우 연산자의 속도는 중요하지 않습니다.중요한 것은 어느 쪽이 원하는 결과를 낳느냐입니다.피연산자 할 수 .
==
★★★★★★★★★★★★★★★★★」===
둘 다 같은 결과를 낳기 때문입니다.이 경우 두 연산자의 속도는 거의 동일합니다.이는 두 연산자 모두 유형 변환을 수행하지 않기 때문입니다.
속도를 비교했습니다.
$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
그리고.$a
이int
타입에는 다음과 같은 것이 있습니다.
if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)
그렇지만string
'1'
ASCII 코드에 캐스팅되지 않음49
,그럴 것이다.1
.
비교할 때$a === $b
그리고.$a
이int
타입에는 다음과 같은 것이 있습니다.
if ($a->int_ == $b->int_)
테스트 결과가 정확하다면 컴파일러의 문제일 것입니다.
프로세서는 클럭 사이클에 따라 지시된 모든 작업을 수행합니다.
할 일이 적으면 하는 것이 더 빠를 것이다.
추가:
아, 실제로 컴파일러가 처리할 기계 코드를 이미 많이 만들고 있다면, 비교해야 할 데이터 유형에 대응하기 위해 수많은 데이터를 이미 추가했다면, 하나의 "작은" IF를 제거해도 속도는 크게 변하지 않습니다.
만약 누군가가 여전히 이것을 읽는다면 나는 더 많은 토론에 흥미가 있다.
필
언급URL : https://stackoverflow.com/questions/2401478/why-is-faster-than-in-php
'IT' 카테고리의 다른 글
React.js의 상태 어레이를 올바르게 수정 (0) | 2022.10.19 |
---|---|
PHP의 cURL POST HTTP 요청에 Authorization 헤더를 포함하려면 어떻게 해야 합니까? (0) | 2022.10.19 |
javascript를 클릭하면 브라우저가 이전 페이지로 돌아갑니다. (0) | 2022.10.19 |
MySQL: [.character.]의 REGEX가 작동하지 않습니다(POSIX 대조 요소는 지원되지 않습니다). (0) | 2022.10.19 |
MySQL의 ENUM 유형 열에 구성원을 추가하려면 어떻게 해야 합니까? (0) | 2022.10.19 |