70 lines
1.9 KiB
PHP
70 lines
1.9 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Illuminate\Support;
|
||
|
|
||
|
use Closure;
|
||
|
|
||
|
class Benchmark
|
||
|
{
|
||
|
/**
|
||
|
* Measure a callable or array of callables over the given number of iterations.
|
||
|
*
|
||
|
* @param \Closure|array $benchmarkables
|
||
|
* @param int $iterations
|
||
|
* @return array|float
|
||
|
*/
|
||
|
public static function measure(Closure|array $benchmarkables, int $iterations = 1): array|float
|
||
|
{
|
||
|
return collect(Arr::wrap($benchmarkables))->map(function ($callback) use ($iterations) {
|
||
|
return collect(range(1, $iterations))->map(function () use ($callback) {
|
||
|
gc_collect_cycles();
|
||
|
|
||
|
$start = hrtime(true);
|
||
|
|
||
|
$callback();
|
||
|
|
||
|
return (hrtime(true) - $start) / 1000000;
|
||
|
})->average();
|
||
|
})->when(
|
||
|
$benchmarkables instanceof Closure,
|
||
|
fn ($c) => $c->first(),
|
||
|
fn ($c) => $c->all(),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Measure a callable once and return the duration and result.
|
||
|
*
|
||
|
* @template TReturn of mixed
|
||
|
*
|
||
|
* @param (callable(): TReturn) $callback
|
||
|
* @return array{0: TReturn, 1: float}
|
||
|
*/
|
||
|
public static function value(callable $callback): array
|
||
|
{
|
||
|
gc_collect_cycles();
|
||
|
|
||
|
$start = hrtime(true);
|
||
|
|
||
|
$result = $callback();
|
||
|
|
||
|
return [$result, (hrtime(true) - $start) / 1000000];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Measure a callable or array of callables over the given number of iterations, then dump and die.
|
||
|
*
|
||
|
* @param \Closure|array $benchmarkables
|
||
|
* @param int $iterations
|
||
|
* @return never
|
||
|
*/
|
||
|
public static function dd(Closure|array $benchmarkables, int $iterations = 1): void
|
||
|
{
|
||
|
$result = collect(static::measure(Arr::wrap($benchmarkables), $iterations))
|
||
|
->map(fn ($average) => number_format($average, 3).'ms')
|
||
|
->when($benchmarkables instanceof Closure, fn ($c) => $c->first(), fn ($c) => $c->all());
|
||
|
|
||
|
dd($result);
|
||
|
}
|
||
|
}
|