процессор получает использование в php?


Я создал эталонный класс, который позволяет пользователю вставлять, например

$timer->checkpoint('1');

Чтобы проверить некоторый код на время, потребление памяти и т. Д..... и в конце кода, если она/он хочет его протестировать, она/он должна вставить

$result=$timer->result();

Это выдает некоторые данные для публичной функции result(), например, использование памяти (с использованием memory_get_peak_usage) и потребление времени (microtime()).

Для меня все это прекрасно работает.

Но как я могу использовать комбинацию существующих встроенных функций php для получения значения, которое можно считать потреблением процессора?

Было довольно легко вычислить, сколько времени было потрачено на определенный фрагмент кода, используя встроенные функции, но у меня возникли проблемы с поиском способа, как получить потребление процессора для определенного фрагмента кода.

Author: Bill the Lizard, 2011-12-07

3 answers

Ненавижу отвечать на свой собственный вопрос, но я провел много исследований, и вот я здесь... В основном то, что я сделал, было так...

        $dat=getrusage();
        foreach ($dat as $key => $val) {
            $usertime= $dat['ru_utime.tv_usec'];
            $systemtime= $dat['ru_stime.tv_usec'];
            $finalresultcpu= ($systemtime + $usertime);
        }
        $this->_cpuTrackers[$name]=$finalresultcpu;
        return $this;
                                              }

Как вы можете видеть, я использовал встроенную функцию getrusage php. Который выдает массив с целой кучей информации, большая часть которой была для меня довольно бесполезна, за исключением ru_utime.tv_usec (время пользователя) и ru_stime.tv_usec (системное время). Чтобы увидеть, сколько мощности процессора потребил скрипт, нам нужно посмотреть на значения "время пользователя" и "системное время" и, как вы можете смотрите в коде, добавьте его, чтобы получить время, которое на самом деле является использованием процессора.

 5
Author: Rene Brakus, 2014-04-28 08:40:32
function cpu_usage(){
    static $R=0;
    $r=$R;
    $R=getrusage();
    $R= $R['ru_utime.tv_sec']*1000000+$R['ru_utime.tv_usec']+
        $R['ru_stime.tv_sec']*1000000+$R['ru_stime.tv_usec'];
    return $R-$r;
}

Использование:

cpu_time(); // optionally initiating, to measure time from this point,
            // not from the script's beginning
// doing some stuff here
echo cpu_time()." elapsed\n";
// doing yet some stuff here
echo cpu_time()." elapsed\n";

В простых случаях это дает то же самое, что и microtime, но с меньшей точностью. Та же функция для microtime:

function stopwatch(){
    static $time=0;
    $prev=$time;
    $time=microtime(true);
    return $time-$prev;
}

Грубого, не использовать так:

stopwatch();
f(); // some function, which calls `stopwatch` in itself too
echo stopwatch();
 0
Author: Miguel, 2017-08-26 11:28:36

А как насчет...?

$pid = getmypid();
$cpu = exec("ps hup $pid|awk '{print $3}'");
 0
Author: Pablo Schelotto, 2018-04-11 10:50:16