W3docs

hrtime()

In questo articolo ci concentriamo sulla funzione PHP hrtime(): panoramica, funzionamento ed esempi pratici di utilizzo.

Questo articolo tratta la funzione PHP hrtime(): cosa fa, come differiscono le sue due modalità di restituzione, perché il suo orologio monotonico la rende lo strumento giusto per il benchmarking, e alcuni esempi pratici che puoi eseguire.

Introduzione alla funzione hrtime()

hrtime() è una funzione built-in disponibile in PHP 7.3 e versioni successive. Legge il timer ad alta risoluzione del sistema e restituisce l'orario corrente con precisione al nanosecondo. Il suo scopo principale è il benchmarking — misurare quanto tempo impiega l'esecuzione di un pezzo di codice.

La parola chiave è monotonico. Un orologio monotonico avanza sempre in avanti a una velocità costante; non è influenzato da modifiche all'orologio di sistema, aggiustamenti NTP o transizioni all'ora legale. È esattamente ciò che serve per misurare il tempo trascorso. Le funzioni basate sull'orologio di parete come microtime() e time() possono saltare in avanti o indietro se l'orologio di sistema viene corretto durante la misurazione, il che corromperebbe un benchmark.

Tieni presente che hrtime() misura il tempo a partire da un'epoca arbitraria (spesso l'avvio del sistema). Il valore assoluto di per sé è privo di significato — è utile solo come differenza tra due letture.

Sintassi e valori restituiti

hrtime(bool $as_number = false): array|int|false
  • $as_number — quando è false (predefinito), restituisce un array a due elementi [seconds, nanoseconds]. Quando è true, restituisce un intero singolo: il tempo totale in nanosecondi.
  • Restituisce false se il timer ad alta risoluzione non è disponibile.

La forma a intero singolo (hrtime(true)) è la più comoda per il benchmarking perché puoi sottrarre direttamente due letture.

Benchmarking con hrtime(true)

php— editable, runs on the server

La logica è: cattura $start, esegui il codice, cattura $end, poi calcola la differenza. Poiché le letture sono in nanosecondi, dividi per 1e6 (1.000.000) per ottenere i millisecondi, o per 1e9 per ottenere i secondi. Il risultato per un sleep di 1,5 ms sarà circa 1.5 ms (il valore esatto varia leggermente in base all'overhead del sistema).

Lettura dell'array [seconds, nanoseconds]

Chiamata senza argomento, hrtime() restituisce un array che puoi destrutturare:

<?php
[$seconds, $nanoseconds] = hrtime();

echo "Seconds since epoch:     $seconds\n";
echo "Nanoseconds component:   $nanoseconds\n";

// Combine both parts into total nanoseconds yourself
$totalNs = $seconds * 1e9 + $nanoseconds;
echo "Total nanoseconds:       $totalNs\n";
?>

Questa forma è raramente necessaria in pratica — hrtime(true) fornisce già il valore combinato — ma mostra cosa sta realmente riportando il timer.

Quando usare hrtime() vs microtime()

  • Usa hrtime() per i micro-benchmark e qualsiasi misurazione in cui l'accuratezza è importante. È monotonico e offre risoluzione al nanosecondo.
  • Usa microtime() quando hai bisogno di un timestamp basato sull'orologio di parete (secondi dall'epoca Unix) piuttosto che una durata trascorsa.

Avvertenze

  • Precisione dei calcoli in virgola mobile. Dividere i nanosecondi per 1e6 produce un float, che va bene per la visualizzazione ma può perdere precisione su intervalli molto lunghi. Mantieni la differenza in nanosecondi interi durante la misurazione e converti solo alla fine.
  • Script con esecuzione molto lunga. Su una build a 32 bit, l'intero in nanosecondi può andare in overflow. Per differenze arbitrariamente grandi, usa le estensioni bcmath o gmp per un'aritmetica precisa.
  • Non trattare il valore come una data. Non è un timestamp Unix; non puoi formattarlo con date().

Conclusione

hrtime() è lo strumento giusto per misurare quanto tempo impiega l'esecuzione del codice PHP. Usa hrtime(true) per ottenere una lettura in nanosecondi prima e dopo il codice, sottrai e converti nell'unità preferita. Il suo orologio monotonico rende il risultato affidabile anche quando l'orologio di sistema cambia — qualcosa che microtime() non può garantire.

Pratica

Pratica
Qual è lo scopo della funzione hrtime() in PHP?
Qual è lo scopo della funzione hrtime() in PHP?
Was this page helpful?