es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando Duration.ofMillis con un valor de nanosegundos.

Encontré un fragmento de código que implementa un temporizador para Micrometer y necesito ayuda para descifrar el siguiente fragmento de código porque creo que lo estoy entendiendo incorrectamente. Según mi entendimiento, stopwatch.stop().elapsed(Nanos) devolverá los nanosegundos que tardó desde el momento en que se inició el cronómetro hasta que se detuvo.

Ahora bien, en cuanto a Duration.ofMillis, he leído la documentación de Java y dice que aquí se supone que se pasa un valor de milisegundos. Este fragmento de código pasa nanosegundos, así que en este caso, ¿funcionará la parte de duration.ofMillis? Suponiendo que el cronómetro se detuvo después de 100 ms, creo que Duration.ofMillis obtendrá el valor 100000000. No puedo entender qué sucede después de eso.

Stopwatch stopwatch = Stopwatch.createStarted();
        meterRegistry.timer(name)
                .record(Duration.ofMillis(stopwatch.stop().elapsed(TimeUnit.NANOSECONDS)));
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El fragmento de código anterior crea un objeto Stopwatch y lo inicia usando Stopwatch.createStarted(). La clase Stopwatch es parte de la biblioteca Guava y se utiliza para medir el tiempo transcurrido.

    La siguiente línea de código registra una métrica de temporizador en meterRegistry con el nombre proporcionado utilizando el método record(). La duración del temporizador registrado se calcula llamando a stopwatch.stop().elapsed(TimeUnit.NANOSECONDS), que devuelve el tiempo transcurrido en nanosegundos desde que se inició el temporizador.

    Sin embargo, a continuación se utiliza el método Duration.ofMillis() para convertir este valor en un objeto Duration, que pretende representar una duración en milisegundos. Esto parece incorrecto ya que el valor del tiempo transcurrido está en nanosegundos, no en milisegundos.

    Es posible que se esté utilizando el método Duration.ofMillis() como un atajo para crear un objeto Duration con la unidad de tiempo correcta, ya que no existe un método Duration.ofNanos() disponible. Sin embargo, el objeto Duration resultante no representará de manera precisa el tiempo transcurrido en milisegundos.

    Si el temporizador se detuvo después de 100 ms, el tiempo transcurrido en nanosegundos sería de 100,000,000. Al llamar a Duration.ofMillis(100_000_000), el objeto Duration resultante representaría una duración de aproximadamente 1667 minutos (100,000,000 / 1000 / 60), lo cual claramente no es lo que se pretendía.

    Para convertir correctamente el tiempo transcurrido en nanosegundos en un objeto Duration en Java, puedes utilizar el siguiente código:

    Duration elapsed = Duration.ofNanos(stopwatch.stop().elapsed(TimeUnit.NANOSECONDS));
    

    Esto crea un objeto Duration con el tiempo transcurrido en nanosegundos. Luego, el objeto Duration se puede utilizar según sea necesario, como en el registro de la métrica del temporizador.

    meterRegistry.timer(name).record(elapsed);
    

Comments are closed.