2

我目前正在制作一个 PHP 计时器,用于检查某种做某事的方式与完成相同工作的另一件事相比需要多少时间,基本上是基准测试。

现在,我还想让这个工具能够判断这种特定的执行方式占用了多少内存。

因此,有关更多信息,我正在使用 microtime 来检查开始时间,在该代码上执行 200 万次循环,然后用一些数学计算另一个 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 进程“A”检查另一个 PHP 进程的内存使用情况吗?

如果是这样的话:

$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 回答