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
falsese 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)
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
1e6produce 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
bcmathogmpper 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.