PHPのforループの実行にかかる時間をミリ秒単位で知りたいのですが。
私は一般的なアルゴリズムの構造を知っていますが、それをPHPに実装する方法はわかりません。
Begin
init1 = timer(); // where timer() is the amount of milliseconds from midnight
the loop begin
some code
the loop end
total = timer() - init1;
End
PHPのforループの実行にかかる時間をミリ秒単位で知りたいのですが。
私は一般的なアルゴリズムの構造を知っていますが、それをPHPに実装する方法はわかりません。
Begin
init1 = timer(); // where timer() is the amount of milliseconds from midnight
the loop begin
some code
the loop end
total = timer() - init1;
End
回答:
このためのmicrotime
関数を使用できます。ドキュメントから:
microtime
—現在のUnixタイムスタンプをマイクロ秒で返す
場合
get_as_float
に設定されTRUE
、その後、microtime()
最も近いマイクロ秒の精度のUnixエポック秒で現在の時刻を表すfloatを返します。
使用例:
$start = microtime(true);
while (...) {
}
$time_elapsed_secs = microtime(true) - $start;
microtime(true)
戻り値を使用して計算する場合に必要です。
get_as_float
としてtrue
)使用すると、秒単位で結果が得られます。
get_as_float
はtrue
、私が言ったことです。isの場合microtime()
、秒を表す値を返します...
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
(答えで詳細情報以下。)
microtime(true)
次の方法で使用できます。
これをphpファイルの先頭に置きます。
//place this before any script you want to calculate time
$time_start = microtime(true);
//スクリプトコードがここに配置されます
// do something
これをphpファイルの最後に置きます:
// Display Script End time
$time_end = microtime(true);
//dividing with 60 will give the execution time in minutes other wise seconds
$execution_time = ($time_end - $time_start)/60;
//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';
結果を出力しますminutes
。
スーパーグローバル配列REQUEST_TIME
から使用できます$_SERVER
。ドキュメントから:
REQUEST_TIME
リクエストの開始のタイムスタンプ。(PHP 5.1.0以降で使用可能です。)
REQUEST_TIME_FLOAT
リクエストの開始のタイムスタンプ。精度はマイクロ秒。(PHP 5.4.0以降で使用可能です。)
これにより、スクリプトの最初にタイムスタンプを保存する必要がなくなります。あなたは単に行うことができます:
<?php
// Do stuff
usleep(mt_rand(100, 10000));
// At the end of your script
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo "Did stuff in $time seconds\n";
?>
ここで$time
は、スクリプトの開始からの経過時間が秒単位でマイクロ秒の精度で含まれます(例:1.341
1秒および341マイクロ秒)
PHPドキュメント: $_SERVER
変数とmicrotime
関数
$start = $_SERVER["REQUEST_TIME_FLOAT"]; $myscript = microtime(true); $bootstrap = $myscript - $start; ...do stuff ...; $myscripttime = microtime(true) - $myscript;
$myscripttime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
は、最初にタイムスタンプを保存しなくても、スクリプトの最後で次のことができるということです。
$time
の違いが含まれます。
1.1
、1秒+ 100マイクロ秒に相当します。
loadtime.phpファイルを作成する
<?php
class loadTime{
private $time_start = 0;
private $time_end = 0;
private $time = 0;
public function __construct(){
$this->time_start= microtime(true);
}
public function __destruct(){
$this->time_end = microtime(true);
$this->time = $this->time_end - $this->time_start;
echo "Loaded in $this->time seconds\n";
}
}
スクリプトの冒頭よりも、<?php
書き込み後include 'loadtime.php'; $loadtime=new loadTime();
ページが最後にロードされると、「Loaded in x seconds」と書き込まれます
</html>
は無効な終了タグの後に表示されます
$start = microtime(true);
for ($i = 0; $i < 10000; ++$i) {
// do something
}
$total = microtime(true) - $start;
echo $total;
microtime()を参照してください。
これは、Pythonのtimeitモジュールが行うように、PHPコードの実行の時間を計る関数です。https://gist.github.com/flaviovs/35aab0e85852e548a60a
どうやって使うのですか:
include('timeit.php');
const SOME_CODE = '
strlen("foo bar");
';
$t = timeit(SOME_CODE);
print "$t[0] loops; $t[2] per loop\n";
結果:
$ php x.php
100000 loops; 18.08us per loop
免責事項:私はこの要旨の著者です
EDIT:はtimeitは、今では別の、自己完結型のプロジェクトですhttps://github.com/flaviovs/timeit
より正確なタイミングがmicrotime()関数で利用できることを除いて、あなたは正しい考えを持っています。
ループ内が高速である場合、見かけ上の経過時間がゼロになる可能性があります。その場合は、コードを別のループで囲み、繰り返し呼び出します。1回あたりの時間を取得するには、違いを反復回数で除算してください。一貫した信頼できるタイミング結果を得るために10,000,000回の反復を必要とするコードをプロファイルしました。
まとめた機能を共有したいと思いました。うまくいけば、時間を節約できます。
もともとはテキストベースのスクリプトのタイミングを追跡するために使用されていたため、出力はテキスト形式です。ただし、必要に応じて簡単にHTMLに変更できます。
スクリプトの開始以降、各ステップで費やされた時間について、すべての計算が行われます。すべての出力を3桁の精度でフォーマットします。(ミリ秒まで。)
スクリプトの先頭にコピーしたら、時間を計りたい各ピースの後にrecordTime関数を呼び出すだけです。
これをスクリプトファイルの先頭にコピーします。
$tRecordStart = microtime(true);
header("Content-Type: text/plain");
recordTime("Start");
function recordTime ($sName) {
global $tRecordStart;
static $tStartQ;
$tS = microtime(true);
$tElapsedSecs = $tS - $tRecordStart;
$tElapsedSecsQ = $tS - $tStartQ;
$sElapsedSecs = str_pad(number_format($tElapsedSecs, 3), 10, " ", STR_PAD_LEFT);
$sElapsedSecsQ = number_format($tElapsedSecsQ, 3);
echo "//".$sElapsedSecs." - ".$sName;
if (!empty($tStartQ)) echo " In ".$sElapsedSecsQ."s";
echo "\n";
$tStartQ = $tS;
}
経過時間を追跡するには、次のようにします。
recordTime("What We Just Did")
例えば:
recordTime("Something Else")
//Do really long operation.
recordTime("Really Long Operation")
//Do a short operation.
recordTime("A Short Operation")
//In a while loop.
for ($i = 0; $i < 300; $i ++) {
recordTime("Loop Cycle ".$i)
}
次のような出力が得られます。
// 0.000 - Start
// 0.001 - Something Else In 0.001s
// 10.779 - Really Long Operation In 10.778s
// 11.986 - A Short Operation In 1.207s
// 11.987 - Loop Cycle 0 In 0.001s
// 11.987 - Loop Cycle 1 In 0.000s
...
// 12.007 - Loop Cycle 299 In 0.000s
これが誰かを助けることを願っています!
これは非常にシンプルで短い方法です
<?php
$time_start = microtime(true);
//the loop begin
//some code
//the loop end
$time_end = microtime(true);
$total_time = $time_end - $time_start;
echo $total_time; // or whatever u want to do with the time
?>
その時間を秒単位で表示したい場合:
<?php
class debugTimer
{
private $startTime;
private $callsCounter;
function __construct()
{
$this->startTime = microtime(true);
$this->callsCounter = 0;
}
public function getTimer(): float
{
$timeEnd = microtime(true);
$time = $timeEnd - $this->startTime;
$this->callsCounter++;
return $time;
}
public function getCallsNumer(): int
{
return $this->callsCounter;
}
}
$timer = new debugTimer();
usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();
usleep(100);
echo '<br />\n
'.$timer->getTimer(). ' seconds before call #'.$timer->getCallsNumer();
秒の小数部(1.321秒など)を返す実装は次のとおりです
/**
* MICROSECOND STOPWATCH FOR PHP
*
* Class FnxStopwatch
*/
class FnxStopwatch
{
/** @var float */
private $start,
$stop;
public function start()
{
$this->start = self::microtime_float();
}
public function stop()
{
$this->stop = self::microtime_float();
}
public function getIntervalSeconds() : float
{
// NOT STARTED
if (empty($this->start))
return 0;
// NOT STOPPED
if (empty($this->stop))
return ($this->stop - self::microtime_float());
return $interval = $this->stop - $this->start;
}
/**
* FOR MORE INFO SEE http://us.php.net/microtime
*
* @return float
*/
private static function microtime_float() : float
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
}
これは平均時間を測定するためのスクリプトです
<?php
$times = [];
$nbrOfLoops = 4;
for ($i = 0; $i < $nbrOfLoops; ++$i) {
$start = microtime(true);
sleep(1);
$times[] = microtime(true) - $start;
}
echo 'Average: ' . (array_sum($times) / count($times)) . 'seconds';
1つの関数で実行時間を秒単位で見つけることができます。
// ampersand is important thing here
function microSec( & $ms ) {
if (\floatval( $ms ) == 0) {
$ms = microtime( true );
}
else {
$originalMs = $ms;
$ms = 0;
return microtime( true ) - $originalMs;
}
}
// you don't have to define $ms variable. just function needs
// it to calculate the difference.
microSec($ms);
sleep(10);
echo microSec($ms) . " seconds"; // 10 seconds
for( $i = 0; $i < 10; $i++) {
// you can use same variable everytime without assign a value
microSec($ms);
sleep(1);
echo microSec($ms) . " seconds"; // 1 second
}
for( $i = 0; $i < 10; $i++) {
// also you can use temp or useless variables
microSec($xyzabc);
sleep(1);
echo microSec($xyzabc) . " seconds"; // 1 second
}