PHP로 작성된 코드의 속도는 어떻게 측정 할 수 있습니까?
PHPPHP로 작성된 코드의 속도는 어떻게 측정 할 수 있습니까?
같은 직업을 수행하는 많은 클래스 중 어떤 클래스가 더 빨리 실행되는지 어떻게 말할 수 있습니까? 그걸 측정 할 소프트웨어가 있습니까?
해결법
-
==============================
1.당신은 (적어도) 두 가지 해결책을 가지고 있습니다.
당신은 (적어도) 두 가지 해결책을 가지고 있습니다.
아주 "순진한"사람은 코드 실행 전후에 마이크로 타임 (true)을 사용하여 실행 중에 얼마나 많은 시간이 경과했는지 확인합니다. 다른 답변은 그것을 말했고 이미 예제를 주었기 때문에 훨씬 더 말할 필요가 없습니다.
몇 가지 지침을 벤치마킹하려는 경우이 방법이 좋습니다. 예를 들어 두 가지 유형의 함수를 비교해보십시오. 수천 번 수행하는 경우 더 나은 방법으로 "변동하는 요소"를 평균화하는 것이 좋습니다.
배열을 직렬화하는 데 걸리는 시간을 알고 싶다면 다음과 같이하십시오.
$before = microtime(true); for ($i=0 ; $i<100000 ; $i++) { serialize($list); } $after = microtime(true); echo ($after-$before)/$i . " sec/serialize\n";
완벽하지는 않지만 유용합니다. 설정하는 데 많은 시간이 필요하지 않습니다.
어떤 스크립트가 전체 스크립트에서 많은 시간을 차지하는지를 확인하고 싶다면 다른 솔루션을 사용하면됩니다.
프로파일 링 파일을 얻으려면 Xdebug를 설치하고 구성해야합니다. 문서의 프로파일 링 PHP 스크립트 페이지를 살펴보십시오.
내가 일반적으로하는 것은 기본적으로 프로파일 러를 활성화하지 않고 (상당히 큰 파일을 생성하고 작업 속도를 늦추는 것), 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 ++ 프로그램에서 가져온 것입니다. http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif http://kcachegrind.sourceforge.net/html/pics/KcgShot3Large.gif PHP 스크립트를 사용하면 정확히 같은 종류의 것을 얻을 수 있습니다 ;-) (KCacheGrind를 사용하면 WinCacheGrind가 KCacheGrind만큼 좋지 않습니다 ...)
이를 통해 애플리케이션에서 시간이 필요한 부분에 대한 멋진 시각을 얻을 수 있습니다. 때로는 모든 것을 느리게하는 기능을 찾아내는 데 도움이되는 경우가 있습니다 ^^
Xdebug는 PHP가 소비 한 CPU 시간을 계산합니다. PHP가 데이터베이스 (예를 들어)로부터 응답을 기다리고있을 때 작동하지 않습니다. 오직 기다리고있어. 따라서 Xdebug는 DB 요청에 많은 시간이 걸리지 않는다고 생각합니다! 이것은 PHP가 아닌 SQL 서버에서 프로파일 링되어야합니다.
희망이 도움이됩니다 :-) 재미있어!
-
==============================
2.빠른 것들을 위해 나는 이것을 (PHP에서) :
빠른 것들을 위해 나는 이것을 (PHP에서) :
$startTime = microtime(true); doTask(); // whatever you want to time echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
http://xdebug.org/와 같은 프로파일 러를 사용할 수도 있습니다.
-
==============================
3.간단한 타이밍 클래스를 만들었습니다. 누군가에게 유용 할 수도 있습니다.
간단한 타이밍 클래스를 만들었습니다. 누군가에게 유용 할 수도 있습니다.
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
-
==============================
4.질문에 대한 직접적인 대답은 다음과 같습니다.
질문에 대한 직접적인 대답은 다음과 같습니다.
예, 있습니다. 나는 왜 누군가가 그것을 아직 언급하지 않았는지 궁금해. 위에서 제안한 답변은 빠른 확인을 위해 문제가되지 않지만 장기적으로 또는 더 큰 프로젝트에 대해서는 확장 할 수 없습니다.
APM (Application Performance Monitoring) 도구를 사용하면 어떨까요? NewRelic, AppDynamics, Ruxit (모두 무료 버전 있음)를 확인하여 메소드 레벨에 대한 모든 애플리케이션의 실행 시간, 리소스 사용, 처리량을 모니터링하십시오.
-
==============================
5.요즘 XHProf를 사용하고 있습니다. http://pecl.php.net/package/xhprof. 그것은 원래 페이스 북에 의해 개발되었고 괜찮은 웹 인터페이스와 함께 제공됩니다.
요즘 XHProf를 사용하고 있습니다. http://pecl.php.net/package/xhprof. 그것은 원래 페이스 북에 의해 개발되었고 괜찮은 웹 인터페이스와 함께 제공됩니다.
-
==============================
6.나는 기존의 모든 함수의 속도를 최대 10 개의 인수로 측정하는 데 사용하는 함수를 자네와 공유하고 싶다.
나는 기존의 모든 함수의 속도를 최대 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" }
-
==============================
7.프레임 워크의 성능을 빠르게 테스트하려면 index.php 파일에 넣을 수 있습니다
프레임 워크의 성능을 빠르게 테스트하려면 index.php 파일에 넣을 수 있습니다
//at beginning $milliseconds = round(microtime(true) * 1000); //and at the end echo round(microtime(true) * 1000) - $milliseconds;
매 순간마다 실행 시간을 밀리 초 단위로 얻을 것입니다. 마이크로 세컨드는 프레임 워크의 경우를 테스트하는데 너무 유용하지 않기 때문에.
-
==============================
8.웹 컨텍스트 외부에서 테스트 할 수있는 것이라면 유닉스 시간 명령을 사용합니다.
웹 컨텍스트 외부에서 테스트 할 수있는 것이라면 유닉스 시간 명령을 사용합니다.
-
==============================
9.Zend Studio는 XDebug 또는 ZendDebugger를 사용하여 프로파일 링을 지원합니다. 모든 기능이 얼마나 오래 걸렸는지를 알려주는 코드를 프로파일 링합니다. 병목 현상이 어디에 있는지 파악하기위한 환상적인 도구입니다.
Zend Studio는 XDebug 또는 ZendDebugger를 사용하여 프로파일 링을 지원합니다. 모든 기능이 얼마나 오래 걸렸는지를 알려주는 코드를 프로파일 링합니다. 병목 현상이 어디에 있는지 파악하기위한 환상적인 도구입니다.
-
==============================
10.조작 전후의 시간 소인 또는 microtime () 저장과 같은 기본 기능을 사용하여 필요한 시간을 계산할 수 있습니다. 그렇게하기는 쉽지만 정확하지는 않습니다. 어쩌면 더 나은 해결책은 Xdebug입니다. 나는 그걸로 일한 적이 없지만, 가장 잘 알려진 PHP 디버거 / 프로파일 러 인 것 같습니다.
조작 전후의 시간 소인 또는 microtime () 저장과 같은 기본 기능을 사용하여 필요한 시간을 계산할 수 있습니다. 그렇게하기는 쉽지만 정확하지는 않습니다. 어쩌면 더 나은 해결책은 Xdebug입니다. 나는 그걸로 일한 적이 없지만, 가장 잘 알려진 PHP 디버거 / 프로파일 러 인 것 같습니다.
from https://stackoverflow.com/questions/1200214/how-can-i-measure-the-speed-of-code-written-in-php by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
여러 키로 다차원 배열 정렬 (0) | 2018.09.14 |
---|---|
문자열을 Date 및 DateTime으로 변환 (0) | 2018.09.14 |
PHP를 사용하여 CSRF 토큰을 올바르게 추가하는 방법 (0) | 2018.09.14 |
PHP에서 echo, print 및 print_r의 차이점은 무엇입니까? (0) | 2018.09.14 |
PHP 코드를 "컴파일"할 수 있습니까? (0) | 2018.09.14 |