mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 17:01:16 +00:00
60 lines
1.3 KiB
PHP
60 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services\AdditionalProcessing\State;
|
|
|
|
use App\Services\AdditionalProcessing\Enums\ProcessingStage;
|
|
use Closure;
|
|
|
|
final class ProcessingMetrics
|
|
{
|
|
private readonly int $startedAtNanoseconds;
|
|
|
|
/**
|
|
* @var array<string, int>
|
|
*/
|
|
private array $stageNanoseconds = [];
|
|
|
|
public function __construct()
|
|
{
|
|
$this->startedAtNanoseconds = hrtime(true);
|
|
}
|
|
|
|
/**
|
|
* @template TValue
|
|
*
|
|
* @param Closure(): TValue $operation
|
|
* @return TValue
|
|
*/
|
|
public function measure(ProcessingStage $stage, Closure $operation): mixed
|
|
{
|
|
$startedAt = hrtime(true);
|
|
|
|
try {
|
|
return $operation();
|
|
} finally {
|
|
$elapsed = hrtime(true) - $startedAt;
|
|
$this->stageNanoseconds[$stage->value] = ($this->stageNanoseconds[$stage->value] ?? 0) + $elapsed;
|
|
}
|
|
}
|
|
|
|
public function elapsedSeconds(): float
|
|
{
|
|
return $this->nanosecondsToSeconds(hrtime(true) - $this->startedAtNanoseconds);
|
|
}
|
|
|
|
/**
|
|
* @return array<string, float>
|
|
*/
|
|
public function stageDurations(): array
|
|
{
|
|
return array_map($this->nanosecondsToSeconds(...), $this->stageNanoseconds);
|
|
}
|
|
|
|
private function nanosecondsToSeconds(int $nanoseconds): float
|
|
{
|
|
return $nanoseconds / 1_000_000_000;
|
|
}
|
|
}
|