2013-04-15 2 views
3

Как рассчитать время процессора, фактически используемое моим скриптом php?Как я могу получить реальное время процессора, используемое в PHP?

Примечание это не то, что я ищу:

<?php 
$begin_time=microtime(true); 
//.. 
//end of the script: 
$total_time=microtime(true)-$begin_time; 

, потому что это даст мне время, прошедшее. Это может включать в себя много времени, используемое несвязанными процессами, запущенными одновременно, а также время ожидания ожидания ввода-вывода.

Я видел там getrusage(), но пользователь комментарий на странице документации говорит:

getrusage() сообщает счетчики ядра, которые обновляются только один раз приложение теряет контекст и переключатель пространства ядра случается. Например, на современных ядрах Linux-серверов это означало бы, что вызовы getrusage() возвращают информацию, округленную на 10 мс, ядра рабочего стола - на 1 мс.

getrusage() вообще не используется для микроизмерений - и getmicrotime (true) может быть гораздо более ценным ресурсом.

так, что это не вариант, не так ли?

Какие у меня альтернативы?

+0

В нем говорится, что getmicrotime (true) может быть гораздо более ценным ресурсом, разве это не означает, что вам предлагается использовать его? – Jonast92

+2

О, и кстати, может это вам не поможет? http://stackoverflow.com/questions/8413323/cpu-get-usage-in-php Посмотрите на принятый ответ – Jonast92

+0

@ Jonast92 относительно вашего первого комментария, он говорит, что microtime (true) гораздо более ценно * по сравнению с getrusage *, и он также говорит, что getrusage совершенно бесполезен. microtime просто не измеряет, что мне нужно измерить. – matteo

ответ

1

Определите «ваш» ввод-вывод. Технически переход памяти в регионы процессора - это ввод-вывод. Вы говорите, что хотите удалить это время из своего расчета? (Я догадываюсь нет)

То, что я получаю, - это, скорее всего, профиль вашего кода. Если вы хотите измерить время, не затраченное на чтение/запись на файлы или сетевые сокеты, просто используйте microtime и добавьте дополнительные вызовы вокруг частей, выполняющих операции ввода-вывода. Затем вы также получите представление о том, сколько времени занимает ваш ввод-вывод. Скорее всего, вы обнаружите, что у вас есть цикл, занимающий больше времени, чем вы ожидаете.

Когда я прохожу так, как это, я либо использую инструменты профилирования в eclipse, либо я использую регистратор времени и выполняю двоичную поисковую вставку времени, регистрирующегося в коде. Обычно я нахожу небольшую область кода, которая занимает 85% измеренного времени и там оптимизируется.

Также как примечание стороны, не позволяйте совершенству стать врагом практического. 90% времени во время вашего процесса ваши вызовы не будут прерваны каким-либо другим процессом, а количество микрочетовиков будет достаточно близко.

+0

Я уже определил, что я имел в виду под i/o, когда я сказал: «Ожидание» для i/o ", поэтому я говорил о тех формах ввода-вывода, в которых процесс ожидает. Ваш предлагаемый трюк использования microtime и добавление дополнительных вызовов вокруг операций ввода-вывода и сетевых операций не решает другую проблему: избегать подсчета времени, которое не тратится на процесс вообще, а на другие процессы. – matteo

+0

с профилированными сотнями тысяч строк php-кода. Я никогда не сталкивался с ситуацией. Я не мог профилировать просто используя microtime, чтобы изолировать длинную часть. Я просто говорю ... у вас может быть.00001%, но я сомневаюсь. – Zak

+0

Относительно этого: «90% времени вашего процесса ваши вызовы не будут прерваны каким-либо другим процессом, а количество микрочетовиков будет достаточно близко». - ни за что. Сделайте несколько десятков запросов одновременно на веб-сервере и наблюдайте за десятками процессов httpd, которые работают одновременно с 1% процессором. О, хорошо, они, вероятно, не прерываются случайным образом в середине не-io-кода, но только в ожидании i/o? так хорошо, ваш трюк может работать на 90%, но эй, окружая каждый запрос и файл, прочитанные с помощью профилирования, не совсем «практичны». – matteo

Смежные вопросы