4

PHP スクリプトが実際に使用する CPU 時間を計算するにはどうすればよいですか?

これは私が探しているものではないことに注意してください:

<?php
$begin_time=microtime(true);
//..
//end of the script:
$total_time=microtime(true)-$begin_time;

それは私に経過時間を与えるからです。これには、同時に実行されている無関係なプロセスによって使用される多くの時間や、I/O の待機に費やされる時間が含まれる場合があります。

getrusage() があるのを見たことがありますが、ドキュメント ページのユーザー コメントには次のように書かれています。

getrusage() は、アプリケーションがコンテキストを失い、カーネル空間への切り替えが発生した場合にのみ更新されるカーネル カウンターを報告します。たとえば、最新の Linux サーバー カーネルでは、getrusage() 呼び出しは 10 ミリ秒で丸められた情報を返し、デスクトップ カーネルでは 1 ミリ秒で丸められます。

getrusage() はマイクロ測定にはまったく使用できません - getmicrotime(true) ははるかに価値のあるリソースかもしれません。

それはオプションではないようですよね?

どのような代替手段がありますか?

4

2 に答える 2

1

「あなたの」I/Oを定義します。技術的には、CPU レジスタへのメモリの移動は I/O です。その時間を計算から除外したいということですか?(ないと思います)

私が得ているのは、おそらく何らかの方法でコードをプロファイリングしようとしているということです。ファイルまたはネットワーク ソケットの読み取り/書き込みに費やされていない時間を測定したい場合は、マイクロタイムを使用して、I/O を実行する部分に余分な呼び出しを配置し​​ます。次に、I/O にかかる時間も把握できます。予想以上に時間がかかるループがあることに気付く可能性が高くなります。

このようにプロファイリングするときは、Eclipse でプロファイリング ツールを使用するか、タイム ロガーを使用してバイナリ検索のようなタイム ログのコードへの挿入を行います。通常、測定時間の 85% を占めている小さなコード領域を見つけて、そこで最適化を行います。

また、補足として、完璧を実践の敵にしないでください。プロセス中の 90% の時間で、呼び出しが他のプロセスによって中断されることはなく、マイクロタイム カウントは十分に近くなります。

于 2013-04-15T19:29:00.747 に答える