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:
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.Stopwatch
C / C ++ en Windows tieneQueryPerformanceCounter
yQueryPerformanceFrequency
C ++ 11 y superior tienenstd::chrono::steady_clock
ostd::chrono::high_resolution_clock
cuando esis_steady
miembro constante estrue
JavaScript 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?