2011-01-25 5 views
1

Я попытался с помощью это так:PHP - с помощью микропоры() для измерения использования процессора блока функции/кода

$now = microtime(true); 
// cpu expensive code here 
echo microtime(true) - $now; 

, но независимо от того, какой код я ввожу между этими заявлениями, я alwasy получить почти то же самое результаты, что-то вроде 3.0994415283203E-6

Что я делаю неправильно?

+1

Попробуйте ввести вызов 'sleep (5):' и убедитесь, что результат изменился. Время должно быть не менее пяти секунд. –

+0

это работает похоже. Я получаю '4.9997820854187' – Alex

+9

Вау! PHP быстро! Он оценивает 'sleep (5);' менее чем за 5 секунд! – Joel

ответ

6

Лучшее решение. Выполните код несколько раз, чтобы усреднить операции:

$runs = 500; 

$start = microtime(true); 
for ($i = 0; $i < $runs; $i++) { 
    //cpu expensive code here 
} 
$end = microtime(true); 
$elapsed = number_format($end - $start, 4); 
$one = number_format(($end - $start)/500, 7); 
echo "500 runs in $elapsed seconds, average of $one seconds per call"; 
+0

, который выглядит намного лучше, спасибо :) – Alex

+0

Я не думаю, что в этом случае будет 5 десятичных знаков. – Jonah

+0

Затем добавьте 6-й или 7-й. Но я сомневаюсь, что какой-нибудь действительно «дорогой» код будет работать меньше, чем e^-5 ... – ircmaxell

3

3.0994415283203E-6 соответствует 0.0000030994415283203.

E-6 указывает, что вы перемещаете десятичную точку влево на шесть мест. E+6 будет означать обратное. Как отметил @deceze, это называется научной нотацией.

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

1

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

Если вы хотите, чтобы подтвердить это, sleep на несколько секунд.

1

Похоже, что вы используете microtime() без дополнительного аргумента, но вы говорите, так что я не уверен на 100%.

Какой выход из этого:

$now = microtime(true); 
sleep(1); 
echo microtime(true) - $now; 
+1

«Истина» - необязательный аргумент. – Joel

0

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

Вы могли бы попробовать сделать длинную петлю, что-то вроде этого:

$x=0; 
while ($x<1000000) 
    { 
    $x++; 
    } 

Добавьте этот код внутри вашего таймера. Для меня цикл 1 миллион раз обычно занимает около 1/2 секунды. Посмотрите, изменит ли это ваше время.

+1

Почему бы не использовать 'sleep' или' usleep', чтобы задержать измеримую величину, а не гадать? – ircmaxell

+0

@ ircmaxell - Не знаю. Это не имеет значения. Это было первое, что мне пришло в голову. – Joel