>  기사  >  백엔드 개발  >  PHP 삼항 연산자: 빠를까 말까?

PHP 삼항 연산자: 빠를까 말까?

藏色散人
藏色散人원래의
2019-01-28 11:26:424723검색

사람들은 최적화를 좋아합니다. 이해하기 쉽고 적용하기도 쉽습니다… 그런데 얼마 전 Twig의 풀 리퀘스트를 보면서 PHP의 삼항 연산자 성능에 대한 흥미로운 토론을 읽었습니다.

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[&#39;test&#39;][$i] = $i;
}
// you can also just create a big string
// $context = str_repeat(&#39; &#39;, 1000000);

// benchmark
$time = microtime(true);
for ($i = 0; $i < 100; $i++) {
    // the snippet of code to benchmark
    $tmp = isset($context[&#39;test&#39;]) ? $context[&#39;test&#39;] : &#39;&#39;;
}
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[&#39;test&#39;];

// the copy happens now
$tmp[] = true;

// copy also happens if the original variable changes
// $context[&#39;test&#39;][] = true;

요약하자면, 삼항 연산자의 속도는 문의 결과를 복사하는 데 걸리는 시간과 직접적인 관련이 있습니다. 엄격하게 요구되는 것은 아닙니다. 100,000개의 요소 배열을 복사하는 데는 시간이 걸립니다.

PHP 5.3을 사용하는 경우 새로운 ?:construct::

$tmp = $context[&#39;test&#39;] ?: &#39;&#39;;

를 사용하여 명령문을 표현하는 더 쉬운 방법이 있습니다. 그러나 성능 측면에서 이 새로운 구문은 표준 구문과 동일한 단점을 갖습니다. PHP는 변수가 존재하는 경우를 최적화할 수 있습니다.

위 내용은 PHP 삼항 연산자: 빠를까 말까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.