Я создал класс тестов, который позволяет пользователю вставлять, например
$timer->checkpoint('1');
проверить код на время, потребление памяти и т. д. и в конце кода, если он / она хочет проверить это, он / она должен вставить
$result=$timer->result();
это дает некоторые данные для результата публичной функции (), например, использования памяти (с использованием memory_get_peak_usage) и времени (microtime ()).
Все это прекрасно для меня.
Но как я могу использовать комбинацию существующих встроенных функций php для получения значения, которое можно считать потреблением процессора ?
Было довольно легко подсчитать, сколько времени было потрачено на определенный фрагмент кода, используя встроенные функции, но у меня возникли проблемы с мыслью о том, как получить потребление ЦП для определенного фрагмента кода.
Ненавижу, чтобы ответить на мой собственный вопрос, но я провел много исследований, и здесь я иду … В основном, что я сделал, это …
$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 (системное время). Чтобы узнать, сколько энергии процессора потребляется, нам нужно посмотреть значения «пользовательское время» и «системное время», и, как вы можете видеть в коде, добавьте его, чтобы получить время, которое на самом деле является использованием процессора.
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();