<?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
{
public function run()
{
return true;
}
}
class Foo
{
public function variadic(\BarInterface ...$bars)
{
foreach ($bars as $bar) {
$bar->run();
}
}
public function iterated(array $bars)
{
foreach ($bars as $bar) {
if (!$bar instanceof \BarInterface) {
throw new \TypeError('Invalid BarInterface specified');
}
}
foreach ($bars as $bar) {
$bar->run();
}
}
}
$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
$start = new \DateTime();
$mem_start = memory_get_usage(true);
$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;
$start = new \DateTime();
$mem_start = memory_get_usage(true);
$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:
37.38 ms | 402 KiB | 5 Q