PHP로 작성된 코드의 속도를 어떻게 측정 할 수 있습니까? [닫은]


118

많은 클래스 (모두 동일한 작업을 수행함)가 더 빨리 실행되는지 어떻게 알 수 있습니까? 그것을 측정하는 소프트웨어가 있습니까?

답변:


195

당신은 (적어도) 두 가지 솔루션을 :

아주 "순진한"사람은 코드의 일부 전후에 microtime (true)을 사용하여 실행 중에 얼마나 많은 시간이 경과했는지 확인합니다. 다른 답변은 이미 예를 들었으므로 더 이상 말하지 않겠습니다.

몇 가지 지침을 벤치마킹하려는 경우 좋은 솔루션입니다. 예를 들어 두 가지 유형의 함수를 비교하는 것과 같습니다. "섭동 요소"가 평균화되도록하는 것이 수천 번 수행하는 것이 좋습니다.

이런 식으로 배열을 직렬화하는 데 걸리는 시간을 알고 싶다면 다음을 수행하십시오.

$before = microtime(true);

for ($i=0 ; $i<100000 ; $i++) {
    serialize($list);
}

$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";

완벽하지는 않지만 유용하며 설정하는 데 많은 시간이 걸리지 않습니다.



전체 스크립트에서 많은 시간이 걸리는 함수를 식별하려는 경우 매우 잘 작동하는 다른 솔루션은 다음을 사용하는 것입니다.

  • 스크립트에 대한 프로파일 링 데이터를 생성하기 위한 Xdebug 확장
  • 프로파일 링 데이터를 읽고 읽을 수있는 것을 제공하는 소프트웨어입니다. 나는 그 중 세 가지를 안다.
    • Webgrind ; 웹 인터페이스; Apache + PHP 서버에서 작동해야합니다.
    • WinCacheGrind ; 창문에서만
    • KCacheGrind ; 아마도 리눅스와 리눅스와 같은 것뿐 일 것이다. 그게 내가 선호하는 것, btw

프로파일 링 파일을 얻으려면 Xdebug를 설치하고 구성해야합니다. 문서 의 Profiling PHP Scripts 페이지를 살펴보십시오 .

내가 일반적으로하는 일은 기본적으로 프로파일 러를 활성화하지 않고 (매우 큰 파일을 생성하고 속도를 느리게 함)XDEBUG_PROFILE 필요한 페이지에 대해서만 프로파일 링을 활성화하기 위해 GET 데이터 라는 매개 변수를 보낼 수있는 가능성을 사용하는 것 입니다.
내 php.ini의 프로파일 링 관련 부분은 다음과 같습니다.

xdebug.profiler_enable = 0              ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1      ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names

(자세한 내용은 설명서 읽기)

이 스크린 샷은 KcacheGrind의 C ++ 프로그램에서 가져온 것입니다 : (출처 : sourceforge.net ) PHP 스크립트로 똑같은 종류의 결과를 얻을 수 있습니다 ;-) (KCacheGrind를 사용하면, WinCacheGrind는 KCacheGrind만큼 좋지 않습니다 ... )http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif



이를 통해 애플리케이션에서 시간이 걸리는 것을 잘 볼 수 있으며 때로는 모든 것을 느리게 하는 함수 를 찾는 데 확실히 도움이 됩니다 ^^

Xdebug는 PHP가 소비 한 CPU 시간을 계산합니다. PHP가 데이터베이스에서 응답을 기다리고있을 때 (예를 들어) 작동하지 않습니다. 오직 기다리고 있습니다. 따라서 Xdebug는 DB 요청에 많은 시간이 걸리지 않는다고 생각합니다!
이것은 PHP가 아닌 SQL 서버에서 프로파일 링되어야합니다.


이것이 도움이되기를
바랍니다 :-) 즐거운 시간 보내세요!


1
QCacheGrind의 윈도우 빌드가 존재 :-) sourceforge.net/projects/qcachegrindwin
프랑수아 브르타뉴어

43

빠른 작업을 위해 (PHP에서) 다음을 수행합니다.

$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time:  " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";

http://xdebug.org/ 와 같은 프로파일 러를 사용할 수도 있습니다 .


2
추가 정확도를 위해 (a) 루프를 사용하고 시간을 평균화하고 (b) 테스트하는 각 항목에 대해 별도의 파일을 사용하는 것이 좋습니다. 하나의 스크립트 내에 여러 타이밍이있는 경우 순서가 때때로 달라질 수 있습니다.
DisgruntledGoat

9

간단한 타이밍 클래스를 만들었습니다. 누군가에게 유용 할 수도 있습니다.

class TimingHelper {

    private $start;

    public function __construct() {
        $this->start = microtime(true);
    }

    public function start() {
        $this->start = microtime(true);
    }

    public function segs() {
        return microtime(true) - $this->start;
    }

    public function time() {
        $segs = $this->segs();
        $days = floor($segs / 86400);
        $segs -= $days * 86400;
        $hours = floor($segs / 3600);
        $segs -= $hours * 3600;
        $mins = floor($segs / 60);
        $segs -= $mins * 60;
        $microsegs = ($segs - floor($segs)) * 1000;
        $segs = floor($segs);

        return 
            (empty($days) ? "" : $days . "d ") . 
            (empty($hours) ? "" : $hours . "h ") . 
            (empty($mins) ? "" : $mins . "m ") . 
            $segs . "s " .
            $microsegs . "ms";
    }

}

사용하다:

$th = new TimingHelper();
<..code being mesured..>
echo $th->time();
$th->start(); // if it's the case
<..code being mesured..>
echo $th->time();

// result: 4d 17h 34m 57s 0.00095367431640625ms 

당신은 잘못 입력했습니다 : 그것은 echo아닙니다$echo
SuN

9

2020 업데이트

이 질문에 마지막으로 답변 한 지 몇 년이 지났으므로 APM 환경에 대한 업데이트가 필요하다고 생각했습니다.

  • AppDynamics는 Cisco에서 구매했으며 그들이 제공하던 영구 무료 계정은 웹 사이트에서 제거되었습니다.
  • NewRelic은 가격을 호스트 당 월 149 달러에서 호스트 당 월 25 달러로 낮추어 APM 시장에 새로 등장한 데이터 독 (호스트 당 31 달러)과 경쟁했습니다.
  • Datadog APM 기능은 여전히 ​​가볍고 원하는 것이 많이 남아 있습니다. 그러나 나는 그들이 내년 동안 이것들을 향상시키고 향상시키는 것을 봅니다.
  • Ruxit은 Dynatrace에서 구매했습니다. Ruxit은 전 Dynatrace 직원에 의해 구축 되었기 때문에 여기에서 더 이상 충격적인 것은 아닙니다. 이를 통해 Dynatrace는 더 나은 방식으로 진정한 SaaS 모델로 전환 할 수있었습니다. 원한다면 부피가 큰 Java 클라이언트와 작별을 고하십시오.
  • 현재 무료 / 오픈 소스 옵션도 있습니다. 체크 아웃 아파치 Skywalking 그들의 최고 기술 기업 중 중국에서 매우 인기가 정확하게 당신이 설치하기 전에 시도 할 수있는 데모를 제공합니다. 이 두 가지 모두 호스팅을 관리해야하므로 가상 머신을 거의 가동하고 설치 및 구성에 시간을 할애 할 준비를하십시오.
  • 저는 이러한 오픈 소스 APM 솔루션 중 하나를 시도하지 않았기 때문에이를 추천 할 수있는 위치에 있지 않습니다. 그러나 저는 이러한 모든 APM 솔루션을 온 프레미스 또는 클라우드에서 수백 개의 애플리케이션을 위해 여러 조직에 배포하는 것을 개인적으로 관리했습니다. 마이크로 서비스. 그래서 저는 확신을 가지고 말할 수 있습니다. 만약 그들이 당신의 청구서에 맞다면 어떤 벤더에게도 잘못 갈 수는 없습니다.


2015 년 10 월 최초 답변

귀하의 질문에 대한 직접적인 답변입니다.

그것을 측정하는 소프트웨어가 있습니까?

네, 있습니다. 왜 아무도 그것을 아직 언급하지 않았는지 궁금합니다. 위에 제안 된 답변은 빠른 확인에는 괜찮아 보이지만 장기적으로 또는 더 큰 프로젝트에서는 확장 할 수 없습니다.

이를 위해 정확히 빌드 된 APM (애플리케이션 성능 모니터링) 도구를 사용하는 것은 어떻습니까? NewRelic, AppDynamics, Ruxit (모두 무료 버전 있음)을 확인하여 모든 애플리케이션의 실행 시간, 리소스 사용량, 메서드 수준에 대한 처리량을 모니터링하십시오.


6

프레임 워크의 성능을 빠르게 테스트하려면 index.php 파일에 넣을 수 있습니다.

//at beginning
$milliseconds = round(microtime(true) * 1000);

//and at the end
echo round(microtime(true) * 1000) - $milliseconds;

매번 밀리 초 단위로 실행 시간을 얻을 수 있습니다. 마이크로 초는 프레임 워크 사례를 테스트하는 데 너무 유용하지 않기 때문입니다.



4

최대 10 개의 인수까지 기존 함수의 속도를 측정하는 데 사용하는 자체 제작 함수를 공유하고 싶습니다.

function fdump($f_name='', $f_args=array()){

    $f_dump=array();
    $f_result='';

    $f_success=false;

    $f_start=microtime();
    $f_start=explode(' ', $f_start);
    $f_start=$f_start[1] + $f_start[0];

    if(function_exists($f_name)){

        if(isset($f_args[0])&&is_array($f_args[0])){
            if($f_result=$f_name($f_args)){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[1])){
            if($f_result=$f_name($f_args[0])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[2])){
            if($f_result=$f_name($f_args[0],$f_args[1])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[3])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[4])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[5])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[6])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[7])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[8])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[9])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8])){
                $f_success=true;
            }
        }
        elseif(!isset($f_args[10])){
            if($f_result=$f_name($f_args[0],$f_args[1],$f_args[2],$f_args[3],$f_args[4],$f_args[5],$f_args[6],$f_args[7],$f_args[8],$f_args[9])){
                $f_success=true;
            }
        }
    }
    $f_end=microtime();
    $f_end=explode(' ', $f_end);
    $f_end=$f_end[1] + $f_end[0];

    $f_time=round(($f_end - $f_start), 4);
    $f_dump['f_success']=$f_success;
    $f_dump['f_time']=$f_time;
    $f_dump['f_result']=$f_result;

    var_dump($f_dump);exit;

    //return $f_result;

}

function do_stuff($arg1='', $arg2=''){
    return $arg1.' '.$arg2;
}

fdump('do_stuff',array('hello', 'world'));

보고

  array(3) {
    ["f_success"]=>
    bool(true)
    ["f_time"]=>
    float(0)            //too fast...
    ["f_result"]=>
    string(11) "hello world"
  }

3

웹 컨텍스트 외부에서 테스트 할 수있는 것이면 Unix time명령을 사용합니다 .


3

Zend Studio에는 XDebug 또는 ZendDebugger를 사용한 프로파일 링 지원이 내장되어 있습니다. 코드를 프로파일 링하여 모든 함수에 걸린 시간을 정확하게 알려줍니다. 병목 지점이 어디인지 알아내는 데있어 환상적인 도구입니다.


1

작업 전후에 타임 스탬프 또는 microtime () 저장과 같은 기본적인 사항을 사용하여 필요한 시간을 계산할 수 있습니다. 쉽게 할 수 있지만 정확하지는 않습니다. 아마도 더 나은 해결책은 Xdebug 일 것입니다. 저는 그것을 사용 해본 적이 없지만 제가 찾을 수있는 가장 잘 알려진 PHP 디버거 / 프로파일 러 인 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.