fisher
накатила суть
XP + PHP Benchmark : асинхронное поведение целой и дробной части microtime
hi, all
столкнулся с удивительной ситуацией
(XP, php4.0.4/pl1):
среди строк лога вижу куски:
...
0.87672100 1022507943
0.87676200 1022507943
0.87686900 1022507944
0.87691100 1022507944
...
0.71578700 1022507944
0.71583200 1022507944
0.71671900 1022507945
0.71677500 1022507945
...
то есть при внимательном рассмотрении видно асинхронное поведение целой и дробной части microtime, т.е. увеличение на 1 у секунд не совпадает с перевалом дробной части через ноль. в результате при проведении тестов на производительность вообще напарываемся на замечательную погрешность измерения в секунду, не говоря уж о замечательных отрицательных интервалах времени:
последний код выдает таких три штуки ~0.99XXX, то есть как раз та самая секунда.
одно "НО" - машина XP (просто кое что надо тестировать с удаленного компа)
Вопрос: встречался ли кто-нибудь с подобной дрянью и что посоветуете? В-общем, понятно, что скорее всего я это как-нибудь обойду, написав на С или Perl, но хотелось бы на PHP. Также ясно, что при малом времени исполнения итерации и длинной выборке это баг внесет небольшую погрешность, но это в общем не так, и меня это совершенно не устраивает. Может, дело в кривой реализации gettimeofday() system call в XP или его кривом использовании в PHP4WIN?
hi, all
столкнулся с удивительной ситуацией
(XP, php4.0.4/pl1):
PHP:
for($i=0;$i<1000000;$i++){
print microtime()."\r\n";
}
...
0.87672100 1022507943
0.87676200 1022507943
0.87686900 1022507944
0.87691100 1022507944
...
0.71578700 1022507944
0.71583200 1022507944
0.71671900 1022507945
0.71677500 1022507945
...
то есть при внимательном рассмотрении видно асинхронное поведение целой и дробной части microtime, т.е. увеличение на 1 у секунд не совпадает с перевалом дробной части через ноль. в результате при проведении тестов на производительность вообще напарываемся на замечательную погрешность измерения в секунду, не говоря уж о замечательных отрицательных интервалах времени:
PHP:
require_once('Benchmark/Iterate.php');
$MM = 10000;
function my_test(){ return; }
$benchmark = new Benchmark_Iterate;
$benchmark->run("my_test", $MM);
$result = $benchmark->get();
for($i=0;$i<$MM;$i++){
if($result[$i]<0) print($result[$i]."\r\n");
}
одно "НО" - машина XP (просто кое что надо тестировать с удаленного компа)
Вопрос: встречался ли кто-нибудь с подобной дрянью и что посоветуете? В-общем, понятно, что скорее всего я это как-нибудь обойду, написав на С или Perl, но хотелось бы на PHP. Также ясно, что при малом времени исполнения итерации и длинной выборке это баг внесет небольшую погрешность, но это в общем не так, и меня это совершенно не устраивает. Может, дело в кривой реализации gettimeofday() system call в XP или его кривом использовании в PHP4WIN?