복붙노트

php5에서 인라인 문자열과 연결을 사용하는 속도 차이?

PHP

php5에서 인라인 문자열과 연결을 사용하는 속도 차이?

(가정 php5) 고려

<?php

    $foo = 'some words';

    //case 1
    print "these are $foo";

    //case 2
    print "these are {$foo}";

    //case 3
    print 'these are ' . $foo;
?>

1과 2 사이에 많은 차이가 있습니까?

그렇지 않다면 1/2과 3 사이는 어떨까요?

해결법

  1. ==============================

    1."실제 생활에서 더 빠를 수있는 것"과 마찬가지로 실제 생활 테스트를 이길 수는 없습니다.

    "실제 생활에서 더 빠를 수있는 것"과 마찬가지로 실제 생활 테스트를 이길 수는 없습니다.

    function timeFunc($function, $runs)
    {
      $times = array();
    
      for ($i = 0; $i < $runs; $i++)
      {
        $time = microtime();
        call_user_func($function);
        $times[$i] = microtime() - $time;
      }
    
      return array_sum($times) / $runs;
    }
    
    function Method1()
    { 
      $foo = 'some words';
      for ($i = 0; $i < 10000; $i++)
        $t = "these are $foo";
    }
    
    function Method2()
    {
      $foo = 'some words';
      for ($i = 0; $i < 10000; $i++)
        $t = "these are {$foo}";
    }
    
    function Method3()
     {
      $foo = 'some words';
      for ($i = 0; $i < 10000; $i++)
        $t = "these are " . $foo;
    }
    
    print timeFunc('Method1', 10) . "\n";
    print timeFunc('Method2', 10) . "\n";
    print timeFunc('Method3', 10) . "\n";
    

    모든 것을 페이지에 넣으려면 몇 번 실행 해주세요.

    0.0035568

    0.0035388

    0.0025394

    따라서 예상대로 보간은 사실상 동일합니다 (노이즈 레벨 차이, 보간 엔진이 처리해야하는 추가 문자로 인한 것일 수 있음). 스트레이트 업 연결은 속도의 약 66 %로 큰 충격이 아닙니다. 보간 파서는 보일 것이고, 아무것도 발견하지 못하고, 간단한 내부 문자열 연결로 끝낼 것입니다. concat이 비싸더라도, 인터폴 레이터는 변수를 파싱하고 원래 문자열을 잘라내거나 복사하는 모든 작업을 수행 한 후에도이를 수행해야합니다.

    Somnath의 업데이트 :

    나는 실시간 로직 위에 Method4 ()를 추가했다.

    function Method4()
     {
      $foo = 'some words';
      for ($i = 0; $i < 10000; $i++)
        $t = 'these are ' . $foo;
    }
    
    print timeFunc('Method4', 10) . "\n";
    
    Results were:
    
    0.0014739
    0.0015574
    0.0011955
    0.001169
    

    문자열 만 선언하고 해당 문자열을 구문 분석 할 필요가없는 경우 PHP 디버거를 구문 분석하기 위해 혼동하지 않는 이유는 무엇입니까? 네가 내 요점을 알기를 바랍니다.

  2. ==============================

    2.성능 차이는 적어도 2012 년 1 월 이후에는 관계가 없었으며 가능성이 더 높았습니다.

    성능 차이는 적어도 2012 년 1 월 이후에는 관계가 없었으며 가능성이 더 높았습니다.

    Single quotes: 0.061846971511841 seconds
    Double quotes: 0.061599016189575 seconds
    

    이전 버전의 PHP는 차이가있었습니다. 따옴표를 붙이려면 개인적으로 작은 따옴표를 사용하는 것이 좋았으므로 편리한 차이였습니다. 이 기사의 결론은 훌륭한 점이다.

    (이 기사가이 구절을 인용했지만, 원래의 퀴즈는 Churchill을 거짓말 쟁이로 묘사하기 위해 Joseph Goebbels의 선전 사역에 의해 발명 된 Winston Churchill에 잘못 속한 것 같다 :

    이것은 느슨하게 "나는 내가 가짜가 아닌 통계를 신뢰하지 않는다"라고 번역합니다.

  3. ==============================

    3.라이브 벤치 마크 :

    라이브 벤치 마크 :

    http://phpbench.com/

    단일 대 큰 따옴표로 변수를 연결할 때 실제로는 미묘한 차이가 있습니다.

  4. ==============================

    4.@ 아담의 시험 사용

    @ 아담의 시험 사용

    "these are " . $foo
    

    다음이 더 빠릅니다.

    'these are ' . $foo;
    

    이것은 이중 따옴표로 묶인 "문자열"이 평가되는데, 여기서는 작은 따옴표가 붙은 '문자열'이 그대로 사용됩니다 ...

  5. ==============================

    5.PHP에서 문자열 연산을 최적화하려고 할 때 너무 복잡해하지 마십시오. 데이터베이스 쿼리가 잘못 작성되었거나 어떤 종류의 캐싱 구성표도 사용하지 않은 경우 연결 대 보간법은 의미가 없습니다 (실제 성능에서). 나중에 코드 디버깅이 쉽고 성능 차이가 미미할 정도로 문자열 연산을 작성하십시오.

    PHP에서 문자열 연산을 최적화하려고 할 때 너무 복잡해하지 마십시오. 데이터베이스 쿼리가 잘못 작성되었거나 어떤 종류의 캐싱 구성표도 사용하지 않은 경우 연결 대 보간법은 의미가 없습니다 (실제 성능에서). 나중에 코드 디버깅이 쉽고 성능 차이가 미미할 정도로 문자열 연산을 작성하십시오.

    @uberfuzzy 이것이 언어의 미세 사안에 대한 질문 일 뿐이라고 생각합니다. 필자는 가벼운 데이터베이스 쿼리와 같은 실제 성능 싱크와 비교할 때 실제 응용 프로그램에서 작은 따옴표, 큰 따옴표 및 heredoc 간의 성능을 무의미하게 비교하는 대화에 추가하려고합니다.

  6. ==============================

    6.실행 시간의 차이는 완전히 무시할 수 있습니다.

    실행 시간의 차이는 완전히 무시할 수 있습니다.

    참조하십시오

    이와 같은 미세 최적화에 시간을 낭비하지 마십시오. 프로파일 러를 사용하여 실제 시나리오에서 응용 프로그램의 성능을 측정 한 다음 실제로 필요한 곳을 최적화하십시오. 단조로운 DB 쿼리를 최적화하면 코드 전체에 마이크로 최적화를 적용하는 것보다 더 큰 성능 향상을 얻을 수 있습니다.

  7. ==============================

    7.나는 포럼 소프트웨어의 개발자 인 바닐라가 자신의 코드에있는 모든 큰 따옴표를 작은 따옴표로 바꾸 었으며 합당한 성능 향상을 보았음을 기억합니다.

    나는 포럼 소프트웨어의 개발자 인 바닐라가 자신의 코드에있는 모든 큰 따옴표를 작은 따옴표로 바꾸 었으며 합당한 성능 향상을 보았음을 기억합니다.

    그래도 토론회 링크를 추적 할 수는 없습니다.

  8. ==============================

    8.변수를 연결할 때 차이점이 있습니다 ... 그리고 결과로 무엇을하고 있는지 ... 그리고 만약 당신이하고있는 것이 출력으로 버려지거나 출력 버퍼링을하고 있다면.

    변수를 연결할 때 차이점이 있습니다 ... 그리고 결과로 무엇을하고 있는지 ... 그리고 만약 당신이하고있는 것이 출력으로 버려지거나 출력 버퍼링을하고 있다면.

    또한, 서버의 메모리 상황은 무엇입니까? 일반적으로 상위 수준 플랫폼에서의 메모리 관리는 하위 플랫폼에서의 메모리 관리보다 ...

    $a = 'parse' . $this; 
    

    사용자 코드 플랫폼 레벨에서 메모리를 관리하고 있습니다 ...

    $a = "parse $this";
    

    PHP 시스템 코드 플랫폼 레벨에서 메모리를 관리하고 있습니다 ...

    CPU와 관련된 이러한 벤치 마크는 전체 내용을 말해주지 않습니다.

    동일한 시뮬레이션을 동시에 1000 번 실행하려고 시도하는 서버에서 벤치 마크를 1000 번 실행하고 벤치 마크를 1000 번 실행하는 중 ... 응용 프로그램의 범위에 따라 크게 다른 결과가 발생할 수 있습니다.

  9. ==============================

    9.큰 따옴표는 훨씬 느려질 수 있습니다. 나는 이것을 여러 곳에서 읽는 것이 더 낫다는 것을 읽었다.

    큰 따옴표는 훨씬 느려질 수 있습니다. 나는 이것을 여러 곳에서 읽는 것이 더 낫다는 것을 읽었다.

    'parse me '.$i.' times'
    

    보다

    "parse me $i times"
    

    두 번째 코드는 좀 더 읽기 쉬운 코드를 제공한다고 말할 수 있습니다.

  10. ==============================

    10.실질적으로 전혀 차이가 없습니다! 타이밍을보십시오 : http://micro-optimization.com/single-vs-double-quotes

    실질적으로 전혀 차이가 없습니다! 타이밍을보십시오 : http://micro-optimization.com/single-vs-double-quotes

  11. ==============================

    11.믹스에 다른 것을 추가하기 위해 큰 따옴표로 묶인 문자열 구문 내에서 변수를 사용하는 경우 :

    믹스에 다른 것을 추가하기 위해 큰 따옴표로 묶인 문자열 구문 내에서 변수를 사용하는 경우 :

    $foo = "hello {$bar}";
    

    ~보다 빠릅니다.

    $foo = "hello $bar";
    

    둘 다 더 빠릅니다.

    $foo = 'hello' . $bar; 
    
  12. ==============================

    12.Adam Wright가 3 개의 변수를 사용하여 수정 한 버전의 예제를 사용하면 결과가 반전되고 처음 두 함수가 실제로 더 빠르고 일관성있게 유지됩니다. 이것은 CLI의 PHP 7.1과 같습니다 :

    Adam Wright가 3 개의 변수를 사용하여 수정 한 버전의 예제를 사용하면 결과가 반전되고 처음 두 함수가 실제로 더 빠르고 일관성있게 유지됩니다. 이것은 CLI의 PHP 7.1과 같습니다 :

    function timeFunc($function, $runs)
    {
        $times = array();
    
        for ($i = 0; $i < $runs; $i++)
        {
            $time = microtime();
            call_user_func($function);
            @$times[$i] = microtime() - $time;
        }
    
        return array_sum($times) / $runs;
    }
    
    function Method1()
    { 
        $foo = 'some words';
        $bar = 'other words';
        $bas = 3;
        for ($i = 0; $i < 10000; $i++)
             $t = "these are $foo, $bar and $bas";
    }
    
    function Method2()
    {
        $foo = 'some words';
        $bar = 'other words';
        $bas = 3;
        for ($i = 0; $i < 10000; $i++)
             $t = "these are {$foo}, {$bar} and {$bas}";
    }
    
    function Method3()
    {
        $foo = 'some words';
        $bar = 'other words';
        $bas = 3;
        for ($i = 0; $i < 10000; $i++)
             $t = "these are " . $foo . ", " . $bar . " and " .$bas;
    }
    
    print timeFunc('Method1', 10) . "\n";
    print timeFunc('Method2', 10) . "\n";
    print timeFunc('Method3', 10) . "\n";
    

    또한 정수 3 대신 '3'을 시도했지만 동일한 결과를 얻습니다.

    $ bas = 3 :

    0.0016254
    0.0015719
    0.0019806
    

    $ bas = '3'으로 :

    0.0016495
    0.0015608
    0.0022755
    

    이러한 결과는 매우 다양합니다 (약 300 %의 변형이 있음). 그러나 평균은 비교적 안정적으로 보이고 (거의 10 건 중 9 건) 항상 2 가지 첫 번째 방법에 대해 더 빠른 실행을 보여줍니다. 방법 2는 항상 방법 1보다 약간 더 빠릅니다.

    결론적으로 말하면, 1 개의 단일 연산 (보간 또는 연결 일 것임)에 대해 사실 인 것이 조합 연산에 항상 해당하는 것은 아닙니다.

  13. from https://stackoverflow.com/questions/13620/speed-difference-in-using-inline-strings-vs-concatenation-in-php5 by cc-by-sa and MIT license