Я хотел увидеть, что было быстрее:
sprintf("%06d",$loops);
или
str_pad($i, 6, '0', STR_PAD_LEFT)
Разница между этими двумя значениями была незначительной.sprintf
был постоянно быстрее, чем str_pad
, но, как правило, примерно на 150 пикосекунд.
Ref: Loops: 10,000 Time: 0.00033807754516602
Time Loop 1: Loops: 10,000 Time: 0.0026688575744629 Time per loop: 0.000000267
Time Loop 2: Loops: 10,000 Time: 0.0040788650512695 Time per loop: 0.000000408
Difference per loop: 0.000 000 141
Ratio Loop2/Loop1: 1.5283187421833
Ratio Loop1/Loop2: 0.65431377133505
Мой код теста:
Когда запускается тестируемый кодменьше времени, чем сам цикл, время цикла будет существенно влиять на результаты.Поэтому я использую эталонный цикл, чтобы вычесть время цикла из тестовых циклов.
Я использовал циклы по 10 000 итераций.
$saveLoops = 10000;
Контрольный цикл:
$loops = $saveLoops;
$t = microtime(true);
while ($loops > 0) {
$loops--;
}
$refTime = microtime(true) - $t;
echo "Ref: Loops: $saveLoops Time: $refTime\n";
LOOP 1
$loops = $saveLoops;
$t = microtime(true);
while ($loops > 0) {
$loops--;
$n = sprintf("%06d",$loops);
}
$t = microtime(true) - $t - $refTime;
$time['End1'] = $t;
$t1 = $t/$saveLoops;
echo "Time Loop 1: Loops: " . number_format($saveLoops) . " Time: $t Time per loop: " . number_format($t1,9) . "\n";
LOOP 2
$loops = $saveLoops;
$t = microtime(true);
while ($loops > 0) {
$loops--;
$n = str_pad($loops, 6, '0', STR_PAD_LEFT);
}
$t = microtime(true) - $t - $refTime;
$time['End2'] = $t;
$t2 = $t/$saveLoops;
echo "Time Loop 2: Loops: " . number_format($saveLoops) . " Time: $t Time per loop: " . number_format($t2,9) . "\n";
Calc Times
$dif = abs($t2 - $t1);
$diff = number_format($dif,9);
$diff = substr($diff,0,5) . ' ' . substr($diff,5,3). ' ' . substr($diff,8,3);
echo "\nDifference per loop: $diff\n";
echo "\nRatio Loop2/Loop1: " . ($time['End2'] / $time['End1']);
echo "\nRatio Loop1/Loop2: " . ($time['End1'] / $time['End2']);