2

私は現在、基本的にベンチマークと同じことを達成する別の方法と比較して、何かを行う特定の方法にかかる時間をチェックするPHPタイマーを作成しています。

さて、私はまた、このツールが特定の方法でどれだけのメモリを占有しているかを知ることができるようにしたいと考えています.

詳細については、マイクロタイムを使用して開始時間を確認し、そのコードで 2000,000 ループを実行してから、別のマイクロタイムを使用して計算にかかった時間を確認しています。 microtime スコープでは、メモリ使用量もチェックします。

これは私の現在のコードです:

// Set the amount of loops to do, default is 2000
$loops = 2000;
$start_time = microtime(true); // Start the timer

for($i = 0; $i < $loops; $i++) {
    // Code to test
}

$total_time = microtime(true) - $start_time; // Stop the timer, and figure out the total

ob_end_flush();   // Enable output again
echo $total_time; // Echo the timer's result
?>
4

2 に答える 2

6

少なくとも 5.2 を使用している場合は、memory_get_peak_usage()問題なく動作するはずです。

http://php.net/manual/en/function.memory-get-peak-usage.php

ループの前に一度呼び出して、その時点までのベースラインを把握し、後でもう一度呼び出して、ループ実行中のピークを確認できます。

コードを変更しています...

// Set the amount of loops to do, default is 2000
$loops = 2000;
$base_mem = memory_get_peak_usage();
$start_time = microtime(true); // Start the timer

for($i = 0; $i < $loops; $i++) {
    // Code to test
}
$end_time = microtime(true);  // Stop the timer
$extra_mem = memory_get_peak_usage();

// figure out the totals
$total_time = $end_time - $start_time;
$total_mem = $extra_mem - $base_mem;

ob_end_flush();   // Enable output again
echo "Total Time: $total_time\n";
echo "Total Mem Above Basline: $total_mem bytes\n";
于 2012-10-05T02:46:57.817 に答える
3

memory_get_usageプロセスがピークに達したと思われる場合は、(http://php.net/manual/en/function.memory-get-usage.php) を使用できます。

または、ときどき呼び出して、最高値を記録することもできます...または好きなように。

しかし、これはプロセス内です。別の PHP プロセスのメモリ使用量をチェックする PHP プロセス「A」について話しているのでしょうか。

もしそうなら:

$myPID = getmypid();
$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats); $i += 2) {
    if (strpos($stats[$i], "$myPID") === false) {
        preg_match('/\d+/', $stats[$i+1], $preRes);
        $res = $preRes[0];
    }
}
//if $res has a value, that value is the kilobytes of memory being used by the other PHP process

このソリューションには問題があります。合計で 2 つ以上の php プロセスを実行している場合、正しいプロセスを取得できるとは限りません。

これを解決するには、最初に他のプロセスを実行し、その PID を取得してから、このプロセスに引数として渡します。確認したいプロセスの PID がある場合は、次のようにします。

$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats); $i += 2) {
    if (strpos($stats[$i], "$otherPID") === 0) {
        preg_match('/\d+/', $stats[$i+1], $preRes);
        $res = $preRes[0];
    }
}
//$res contains the result you want in kilobytes

あなた以外のすべてのプロセスのメモリを確認することもできます。

$myPID = getmypid();
$stats = explode("\n", shell_exec('pmap $(pgrep php) | grep \'total\\|\\:\''));
for ($i = 0; $i < count($stats) - 1; $i += 2) {
    if (strpos($stats[$i], "$myPID") === false) {
        preg_match('/\d+/', $stats[$i+1], $preRes);
        $res[] = $preRes[0];
    }
}

したがって、最大のメモリ使用量を取得するには、$max 変数を保持し、それに対してチェックを続けます。

于 2012-10-05T02:18:53.870 に答える