3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types = 1); /** @noinspection AutoloadingIssuesInspection */ class BenchmarkCase { public static $maxNameLength; public $callable; public $iterations = 0; public $name; public $timing = 0; public static function create(string $name, callable $callable): self { $self = new self; $self->name = $name; $self->callable = $callable; self::$maxNameLength = max(self::$maxNameLength, strlen($name)); return $self; } public static function printResults(float $initialMs, array $cases): void { $durationMs = microtime(true) - $initialMs; printf("\r"); usort($cases, static function (BenchmarkCase $a, BenchmarkCase $b) { return $a->timing <=> $b->timing; }); $caseFirst = $cases[0]->timing; /** @var BenchmarkCase $case */ foreach ($cases as $case) { printf("Case %s duration of %.6fs (avg. each %.8fs) +%.2f%%\n", str_pad($case->name, self::$maxNameLength, ' '), $case->timing, bcdiv((string) $case->timing, (string) $case->iterations, 8), (100 / $caseFirst * $case->timing) - 100); } printf("\nTotal duration: %.6fs", $durationMs); } } set_error_handler(static function ($severity, $message) { throw new ErrorException($message, 0, $severity); }); $cases = [ BenchmarkCase::create('array_merge() inside looping', static function () { $arr = []; for ($i = 0; $i < 100; $i++) { $arr = array_merge($arr, [ $i, $i ]); } return $arr; }), BenchmarkCase::create('array_merge() after looping', static function () { $arrArr = []; for ($i = 0; $i < 100; $i++) { $arrArr[] = [ $i, $i ]; } return array_merge(... $arrArr); }), BenchmarkCase::create('array_push() inside looping', static function () { $arr = []; for ($i = 0; $i < 100; $i++) { array_push($arr, $i, $i); } return $arr; }), ]; const BENCHMARK_DURATION_MS = 1500; const CYCLES_ITERATION = 100; $initialMs = microtime(true); $stopTiming = $initialMs + BENCHMARK_DURATION_MS / 1000; while (($currentTiming = microtime(true)) < $stopTiming) { /** @noinspection NonSecureShuffleUsageInspection */ shuffle($cases); /** @var BenchmarkCase $case */ foreach ($cases as $case) { $startMs = microtime(true); for ($j = 0; $j < CYCLES_ITERATION; $j++) { call_user_func($case->callable); } $case->iterations += CYCLES_ITERATION; $case->timing += microtime(true) - $startMs; } } BenchmarkCase::printResults($initialMs, $cases);

preferences:
29.14 ms | 402 KiB | 5 Q