문자열을 작성하는 방법이 중요합니다: PHP 벤치마킹

다양한 방법으로 지정, 사용 및 인쇄할 수 있습니다string in PHP. 그들은 모두 다른 장점과 단점을 가지고 있으며 그것은 이 기사의 내용이 아닙니다. 이 테스트의 초점은 다른 문자열 사양을 사용하는 것이 PHP 코드의 성능에 어떤 영향을 미치는지 확인하는 것입니다.

TL;DR: Single quoted strings are the most performing, both for simple text and for concatenation with other variables.



테스트



문자열 사양의 3가지 유형 비교:
  • 작은따옴표(예: echo 'string'; )
  • 큰따옴표(예: echo "string"; )
  • HEREDOC(예: 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 을 클릭하면 전체 데이터가 포함된 공유 스프레드시트에 액세스할 수 있습니다.




    시스템/버전


  • PHP 7.4.19
  • Amazon Linux 2 AMI
  • 커널 4.14.232-177.418.amzn2.x86_64
  • 16GB 메모리
  • 가상 CPU 4개
  • 좋은 웹페이지 즐겨찾기