사람들은 최적화를 좋아합니다. 이해하기 쉽고 적용하기도 쉽습니다… 그런데 얼마 전 Twig의 풀 리퀘스트를 보면서 PHP의 삼항 연산자 성능에 대한 흥미로운 토론을 읽었습니다.
다음 중 가장 빠른 것이 무엇인지 아시나요? (물론 똑같은 일을 합니다.)
// snippet 1 $tmp = isset($context['test']) ? $context['test'] : ''; // snippet 2 if (isset($context['test'])) { $tmp = $context['test']; } else { $tmp = ''; }
정답은
상황에 따라 다릅니다. 대부분의 경우 속도는 동일하므로 신경 쓸 필요가 없습니다. 그러나 $context['test']에 많은 데이터가 포함되어 있으면 스니펫 2가 스니펫 1보다 훨씬 빠릅니다.
다음은 다양한 시나리오를 테스트하는 데 사용한 코드입니다.
$context = array('test' => true); // optionally fill-in the test value with lots of data for ($i = 0; $i < 100000; $i++) { $context['test'][$i] = $i; } // you can also just create a big string // $context = str_repeat(' ', 1000000); // benchmark $time = microtime(true); for ($i = 0; $i < 100; $i++) { // the snippet of code to benchmark $tmp = isset($context['test']) ? $context['test'] : ''; } printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
참고, 여기서 절대 성능 수치는 의미가 없습니다. 우리는 서로 다른 클립 간의 속도를 비교하고 싶습니다.
내 노트북에서는 스니펫 1을 실행하는 데 2초 이상이 걸리는 반면, 스니펫 2는 약 0.05ms가 걸립니다. 그것은 큰 차이입니다! 그러나 테스트 중인 변수가 많은 데이터를 전달하지 않으면 속도는 거의 같습니다.
그러면 왜 삼항 연산자는 왜 테스트 변수에 저장된 값에 의존합니까?
답은 매우 간단합니다.
삼항 연산자는 항상 값을 복사하지만 if 문은 그렇지 않습니다. 값을 복사합니다. 이유는 무엇입니까? PHP는 쓰기 중 복사라는 기술을 사용하기 때문에 변수에 값을 할당할 때 PHP는 변수가 수정될 때까지 실제로 변수 내용의 복사본을 생성하지 않습니다.
$tmp = $context['test']와 같은 문을 작성하면 거의 아무 일도 일어나지 않습니다. $tmp 변수는 단지 $context['test'] 변수에 대한 참조가 되기 때문에 속도가 매우 빠릅니다. 하지만 변수를 수정하려는 즉시 PHP는 원본 변수를 복사해야 합니다.
$tmp = $context['test']; // the copy happens now $tmp[] = true; // copy also happens if the original variable changes // $context['test'][] = true;
요약하자면, 삼항 연산자의 속도는 문의 결과를 복사하는 데 걸리는 시간과 직접적인 관련이 있습니다. 엄격하게 요구되는 것은 아닙니다. 100,000개의 요소 배열을 복사하는 데는 시간이 걸립니다.
PHP 5.3을 사용하는 경우 새로운 ?:construct::
$tmp = $context['test'] ?: '';
를 사용하여 명령문을 표현하는 더 쉬운 방법이 있습니다. 그러나 성능 측면에서 이 새로운 구문은 표준 구문과 동일한 단점을 갖습니다. PHP는 변수가 존재하는 경우를 최적화할 수 있습니다.
위 내용은 PHP 삼항 연산자: 빠를까 말까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!