<?php
interface BarInterface{}
function getMemoryUsage($size){
static $unit=['b','kb','mb','gb','tb','pb'];
return $size > 0 ? @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i] : 0 . ' byte';
}
class Bar implements BarInterface
{
}
class Foo
{
public function variadic(\BarInterface ...$bars){}
public function iterated(array $bars){}
}
$bars = [];
for ($i=0; $i<10000 ;$i++) {
$bars[] = new \Bar();
}
$foo = new Foo();
$items = \count($bars);
//initial call to reduce overhead
$foo->variadic(...[]);
$foo->iterated([]);
microtime(true);
memory_get_usage(true);
//benchmark start
$mem_start = memory_get_usage(true);
$start = new \DateTime();
$foo->variadic(...$bars);
$mem_variadic = memory_get_usage(true);
$variadic = new \DateTime();
$variadicDiff = $start->diff($variadic)->format('%f');
printf('%sms (variadic passed %d %s increase)', $variadicDiff, $items, getMemoryUsage($mem_variadic-$mem_start));
echo \PHP_EOL . '--------' . \PHP_EOL;
$mem_start = memory_get_usage(true);
$start = new \DateTime();
$foo->iterated($bars);
$mem_iterated = memory_get_usage(true);
$iterated = new \DateTime();
$iteratedDiff = $start->diff($iterated)->format('%f');
printf('%sms (iterated passed %d %s increase)', $iteratedDiff, $items, getMemoryUsage($mem_iterated-$mem_start));
echo \PHP_EOL . '--------' . \PHP_EOL;
if ($variadicDiff > $iteratedDiff) {
$loser = 'Variadic';
$diff = $variadicDiff - $iteratedDiff;
$loss = $diff / $iteratedDiff;
} else {
$loser = 'Iterated';
$diff = $iteratedDiff - $variadicDiff;
$loss = $diff / $variadicDiff;
}
printf('%s was slower by %.2f%% (%d ms)', $loser, $loss * 100, $diff);
preferences:
32.89 ms | 402 KiB | 5 Q