回答:
あなたには(少なくとも) 2つの解決策があります:
非常に「ナイーブ」なものは、コードの一部の前後にmicrotime(true)を使用して、実行中に経過した時間を取得します。他の答えはそれを言って、すでに例を挙げたので、私はこれ以上は言いません。
いくつかの指示をベンチマークする場合、これは良い解決策です。たとえば、2種類の関数を比較するようなものです。「摂動要素」が平均化されていることを確認するには、何千回も実行する方が良いです。
このようなものなので、配列のシリアル化にかかる時間を知りたい場合:
$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 ++プログラムからのものです:(source:sourceforge.net) PHPスクリプトでもまったく同じ種類のものが得られます
;-)(KCacheGrindを使用すると、つまり、WinCacheGrindはKCacheGrindほど良くありません... )
これにより、アプリケーションで何が時間がかかるかについての良い見解を得ることができます-そして時々、すべてを遅くしている関数を見つけるのに間違いなく役立ちます^^
Xdebugは、PHPが費やしたCPU時間をカウントすることに注意してください。PHPが(たとえば)データベースからの回答を待っているとき、PHPは機能しません。待っているだけ。そのため、XdebugはDBリクエストにそれほど時間はかからないと考えます。
これは、PHPではなくSQLサーバーでプロファイルする必要があるので...
これがお役に立て
ば幸いです:-)
楽しんでください!
簡単なもののために、私はこれを(PHPで)行います:
$startTime = microtime(true);
doTask(); // whatever you want to time
echo "Time: " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";
http://xdebug.org/のようなプロファイラーを使用することもできます。
簡単なタイミングクラスを作成しました。多分それは誰かにとって役に立つでしょう:
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
2020年の更新
私がこの質問に最後に回答してから何年も経っていますので、これはAPMランドスケープの更新に値するものだと思いました。
ここにあなたの質問への直接の答えがあります
それを測定するソフトウェアはありますか?
はいあります。なぜ誰もそれをまだ言及していないのかと思います。上記の回答は簡単なチェックでは問題ないように見えますが、長期的には、またはより大きなプロジェクトでは拡張性がありません。
そのために正確に構築されたアプリケーションパフォーマンス監視(APM)ツールを使用しないでください。NewRelic、AppDynamics、Ruxit(すべて無料版があります)をチェックして、すべてのアプリケーションの実行時間、リソース使用量、スループットをメソッドレベルまで監視します。
私は最近XHProfを使用していますhttp://pecl.php.net/package/xhprof。それはもともとFacebookによって開発され、まともなwebインターフェイスが付属しています。
最大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"
}
Zend Studioには、XDebugまたはZendDebuggerを使用したプロファイリングのサポートが組み込まれています。コードのプロファイルを作成し、すべての関数にかかった正確な時間を通知します。それはあなたのボトルネックがどこにあるかを理解するための素晴らしいツールです。