Mida correctamente la duración del tiempo en Go

¿Cuál es la forma correcta de medir con precisión una duración de tiempo en Go? La mayoría de las aplicaciones solo usan el paquete de tiempo estándar y el siguiente enfoque:

var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime

Sin embargo,time.Now() devuelve la hora actual del sistema, lo que conduce a dos fallas:

Si se cambia la hora del sistema durante la medición (por ejemplo, debido a uncambio de zona horaria (DST) o unsegundo salto), la duración resultante también es incorrecta.

El tiempo del sistema puede marcar deliberadamente más rápido o más lento que el tiempo real. Esto siempre sucede cuando el sistema operativo sincroniza el reloj interno con los servidores de hora NTP (¡lo cual puede ocurrir varias veces por hora!)

DeMSDN:

[El servicio horario] ajusta la frecuencia del reloj local para permitir que converja hacia la hora correcta. Si la diferencia horaria entre el reloj local y la [muestra de hora precisa] es demasiado grande para corregirla ajustando la frecuencia del reloj local, el servicio de hora establece el reloj local en la hora correcta.

Si la hora del sistema cambia (ya sea manualmente o debido al horario de verano), es posible detectar la duración no válida y descartarla. Pero si el reloj del sistema funciona, p. Ej. 10% más rápido para sincronizar con el horario mundial, es prácticamente imposible de detectar. Ese es el comportamiento previsto y cómo está diseñado el reloj del sistema.

Por esa razón, la mayoría de los otros idiomas ofrecen una API dedicada para medir duraciones:

Java tieneSystem.nanoTime(), System.currentTimeMillis() sería equivalente atime.Now() y esta malC # tieneSystem.Diagnostics.StopwatchC / C ++ en Windows tieneQueryPerformanceCounter yQueryPerformanceFrequencyC ++ 11 y superior tienenstd::chrono::steady_clockostd::chrono::high_resolution_clock cuando esis_steady miembro constante estrueJavaScript tieneperformance.now(), mientras que el uso denew Date() Está Mal

¿Cuál es la forma correcta de medir con precisión el tiempo de ejecución en Go?

Respuestas a la pregunta(3)

Su respuesta a la pregunta