Usando Time.now
(que devuelve el reloj de pared hora) como líneas base tiene un par de problemas que pueden provocar un comportamiento inesperado. Esto se debe al hecho de que el tiempo de reloj de pared está sujeto a cambios como segundos intercalares insertados o time slewing para ajustar la hora local a un tiempo de referencia.
Si, p. un segundo intercalar insertado durante la medición, se desactivará por un segundo. Del mismo modo, dependiendo de las condiciones del sistema local, es posible que tenga que lidiar con los horarios de ahorro de energía, los relojes que corren más rápido o más lento, o que el reloj retroceda en el tiempo, lo que da como resultado una duración negativa y muchos otros problemas.
Una solución a este problema es utilizar una hora diferente del reloj: un reloj monotónico. Este tipo de reloj tiene diferentes propiedades que el reloj de pared. Se incrementa monitónicamente, es decir, nunca retrocede y aumenta a una velocidad constante. Con eso, no representa el reloj de pared (es decir, el momento en que lee desde un reloj en su pared), sino una marca de tiempo que puede comparar con una marca de tiempo posterior para obtener una diferencia.
En Ruby, se puede utilizar una marca de tiempo con tales Process.clock_gettime(Process::CLOCK_MONOTONIC)
gusta sigue:
t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63988.576809828
sleep 1.5 # do some work
t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# => 63990.08359163
delta = t2 - t1
# => 1.5067818019961123
delta_in_milliseconds = delta * 1000
# => 1506.7818019961123
El método Process.clock_gettime
devuelve una marca de tiempo como un flotador con fracciones de segundo. El número real devuelto no tiene un significado definido (en el que debe confiar). Sin embargo, puede estar seguro de que la próxima llamada devolverá un número mayor y al comparar los valores, puede obtener la diferencia de tiempo real.
Estos atributos hacen que el método sea un candidato ideal para medir las diferencias de tiempo sin ver su programa fallar en los momentos menos oportunos (por ejemplo, a medianoche en la víspera de Año Nuevo cuando se inserta otro segundo intercalado).
Los tiempos de fundición para flotar aquí son innecesarios. –