Информация о процессоре
Для этого необходимо использовать метод getrusage(). Но учтите, что на Windows эта функция работать не будет.
print_r(getrusage());
/* prints
Array
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ru_maxrss] => 12692
[ru_ixrss] => 764
[ru_idrss] => 3864
[ru_minflt] => 94
[ru_majflt] => 0
[ru_nsignals] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => 0
[ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => 0
)
*/
Картина, изложенная выше, будет понятно тем, у кого есть опыт в системном администрировании. Для всех остальных предлагаем расшифровку:
ru_oublock: количество операций блочной записи
ru_inblock: количество операций блочного чтения
ru_msgsnd: количество отправленных сообщений
ru_msgrcv: количество принятых сообщений
ru_maxrss: максимальный размер невыгружаемого набора
ru_ixrss: общий объем разделяемой памяти
ru_idrss: общий объем неразделяемых данных
ru_minflt: количество используемых страниц памяти
ru_majflt: количество ошибок отсутствия страниц
ru_nsignals: количество принятых сигналов
ru_nvcsw: количество переключений контекста процессом
ru_nivcsw: количество принудительных переключений контекста
ru_nswap: количество обращений к диску при подкачке страниц
ru_utime.tv_usec: время работы в пользовательском режиме (микросекунды)
ru_utime.tv_sec: время работы в пользовательском режиме (секунды)
ru_stime.tv_usec: время работы в привилегированном режиме (микросекунды)
ru_stime.tv_sec: время работы в привилегированном режиме (секунды)
Для того чтобы узнать какие ресурсы вашего процессора используются скриптом, вам необходимо значение ‘user time’ (время работы в пользовательском режиме) и ’system time’ (время работы в привилегированном режиме). Вы можете получить результат как в секундах, так и в микросекундах. Для того чтобы превратить общее количество секунд в десятичное число, вам необходимо разделить значение микросекунд на 1 миллион и добавить к значению секунд.
Запутанно как-то. Вот пример:
// отдыхаем 3 секунды
sleep(3);
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* выводит
User time: 0.011552
System time: 0
*/
Хотя выполнение скрипта заняло около 3х секунд, процессор не было сильно нагружен. Дело в том, что при вызове (sleep) скрипт практически не потребляет ресурсов процессора. Вообще существует множество задач, которые занимают значительное время, но при этом не используют процессор. К примеру, ожидание операций связанных с диском. Так что вы не всегда используете процессорное время в своих скриптах.
Вот ещё пример:
// пройтись 10 миллионов раз
for($i=0;$i<10000000;$i++) {
}
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* выводит
User time: 1.424592
System time: 0.004204
*/
Работа скрипта заняла 1.4 секунды процессорного времени. В данном случае, время системных вызова вообще низко.
Время работы в привилегированном режиме (System Time) – это время, которое процессор затрачивает на выполнение системных запросов к ядру от имени программы. Пример:
$start = microtime(true);
// вызываем microtime каждые 3 секунды
while(microtime(true) - $start < 3) {
}
$data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000);
/* выводит
User time: 1.088171
System time: 1.675315
*/
Теперь системного времени затратилось намного больше, чем в прошлом примере. Всё благодаря методу microtime(), который использует ресурсы системы.
Однако следует отметить, что выведенное время может быть не точным, т.к. в данный момент времени ресурсы процессора используются и другими программами, что в результате может дать небольшую погрешность.