문자열을 작성하는 방법이 중요합니다: PHP 벤치마킹
19929 단어 webdevperformancebenchmarkphp
TL;DR: Single quoted strings are the most performing, both for simple text and for concatenation with other variables.
테스트
문자열 사양의 3가지 유형 비교:
echo 'string';
) echo "string";
) echo <<<EOT string EOT;
) 각 사양 유형에 대해 2가지 테스트:
'string'
) 'string'.$var
) 반복
강력한 워크로드를 시뮬레이션하고 더 많은 데이터를 확보하기 위해 코드는 5초 동안 일시 중지하여 10회 반복 실행했습니다. 각 반복마다 1백만
echo
이 중단 없이 실행되었습니다.기계 부하로 인해 결과가 왜곡되지 않도록 하기 위해 3개의 다른 사양이 모두 동일한 반복 내에서 동일한 5초 지연으로 하나씩 실행됩니다. 따라서 어느 시점에서든 부하가 서로 다른 사양 간에 균등하게 분산되어야 합니다.
완충기
문자열의 실제 인쇄가 이러한 테스트에 영향을 미치지 않아야 하므로
ob_start()
및 ob_end_clean()
는 아무 것도 인쇄하지 않는 데 사용되며 ob_clean()
는 버퍼를 비우기 위해 각 반복 내에서 사용됩니다.코드
테스트를 실행하는 데 사용되는 코드입니다.
<?php
define('MAX_PER_ITERATION', 10000000);
define('MAX_ITERATIONS', 10);
define('SLEEP_TIME', 5);
echo "TEST 1: Simple String\n";
$times = [
'quote' => [],
'doublequote' => [],
'heredoc' => []
];
for ($k = 1; $k <= MAX_ITERATIONS; $k++) {
echo "Iteration ".$k."\n";
/* Start Single Quote tests */
echo "\tQuote\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo 'string';
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['quote'][] = $diff;
sleep(SLEEP_TIME);
/* Start Double Quote tests */
echo "\tDouble Quote\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo "string";
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['doublequote'][] = $diff;
sleep(SLEEP_TIME);
/* Start HEREDOC tests */
echo "\tHeredoc\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo <<< EOT
string
EOT;
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['heredoc'][] = $diff;
sleep(SLEEP_TIME);
}
foreach ($times as $type => $results) {
echo $type."\n";
foreach ($results as $r) {
echo "\t\t".$r."\n";
}
$avg = array_sum($results) / sizeof($results);
echo "\tAvg: ".$avg."\n";
}
sleep(100);
echo "TEST 2: String with Variable\n";
$times = [
'quote' => [],
'doublequote' => [],
'heredoc' => []
];
$variable = 'string2';
for ($k = 1; $k <= MAX_ITERATIONS; $k++) {
echo "Iteration ".$k."\n";
/* Start Single Quote tests */
echo "\tQuote\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo 'string'.$variable;
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['quote'][] = $diff;
sleep(SLEEP_TIME);
/* Start Double Quote tests */
echo "\tDouble Quote\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo "string $variable";
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['doublequote'][] = $diff;
sleep(SLEEP_TIME);
/* Start HEREDOC tests */
echo "\tHeredoc\n";
ob_start();
$start = microtime(true);
for ($i = 0; $i < MAX_PER_ITERATION; $i++) {
echo <<< EOT
string {$variable}
EOT;
ob_clean();
}
$diff = (microtime(true) - $start);
ob_end_clean();
$times['heredoc'][] = $diff;
sleep(SLEEP_TIME);
}
foreach ($times as $type => $results) {
echo $type."\n";
foreach ($results as $r) {
echo "\t\t".$r."\n";
}
$avg = array_sum($results) / sizeof($results);
echo "\tAvg: ".$avg."\n";
}
요약 결과
당연히 작은따옴표 문자열이 가장 빠릅니다. 변수나 특수 문자(예:
\n
)에 대한 구문 분석이 필요하지 않기 때문에 간단한 문자열과 변수 모두에 대해 다른 문자열보다 빠르게 실행됩니다.0.3838947773
초(100만 실행)0.532834816
초(100만 회 실행)Heredoc은 특히 변수가 없을 때 작은따옴표 문자열보다 약간 느리지만 큰따옴표 문자열보다 빠릅니다.
0.387871933
초(100만 실행)0.553892827
초(100만 회 실행)마지막으로 큰따옴표 문자열:
0.3914105415
초(100만 실행)0.5623492718
초(100만 회 실행)완전한 결과
아래에서 최종 결과를 살짝 엿볼 수 있습니다. 이미지 또는 here 을 클릭하면 전체 데이터가 포함된 공유 스프레드시트에 액세스할 수 있습니다.
시스템/버전
Reference
이 문제에 관하여(문자열을 작성하는 방법이 중요합니다: PHP 벤치마킹), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/andreaolivato/how-you-write-your-string-matters-benchmarking-php-dlf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)