time: Duraciones, medición y espera.
Explique la diferencia entre las unidades de Duration y realtime·monotonic clock.
Wave Foundation
Duration
Duration en std::time::duration tiene seconds y nanoseconds. El rango normalizado de nanoseconds es de 0 a 999999999. 1000 milisegundos equivalen a 1 segundo.
time_duration_from_ms(milliseconds: i64) -> Duration
time_duration_from_seconds(seconds: i64) -> Duration
time_duration_checked_add(left: Duration, right: Duration) -> DurationResult
time_duration_to_ns(value: Duration) -> DurationValueResult
Los resultados de la operación checked y de la conversión de enteros incluyen ok y value. Reemplazar el ancho Duration con un único valor de nanosegundos i64 puede estar fuera de rango, así que verifique ok primero.
Distinguir entre medición y visión.
std::time::clock a time_now_realtime(tp: ptr<TimeSpec>) -> i64 corresponden a tiempos del calendario. Utilice time_now_monotonic para mediciones de tiempo transcurrido, ya que esto puede cambiar con las correcciones del reloj del sistema. El almacén de resultados lo proporciona la persona que llama y solo lee sec/nsec si el estado es exitoso.
std::time::sleep
time_sleep(duration: Duration) -> i64
time_sleep_ms(ms: i64) -> i64
time_sleep_us(us: i64) -> i64
time_sleep_ns(ns: i64) -> i64
time_sleep_seconds(seconds: i64) -> i64
Una espera negativa es un error y 0 es un éxito inmediato. Después de interruption, sólo se esperará el tiempo restante hasta monotonic deadline. Debido a que la hora de despertar real puede retrasarse debido a la programación, no se utiliza como una función que garantice un tiempo de ejecución preciso. Llamar sincrónico a sleep dentro de la tarea async puede impedir el progreso del ejecutor, así que elija task::sleep_ms.
Ejemplo de conversión de unidades
import("std::time::duration")::{
Duration, DurationValueResult, time_duration_from_ms, time_duration_to_ns
};
fun main() -> i32 {
var duration: Duration = time_duration_from_ms(1500);
var value: DurationValueResult = time_duration_to_ns(duration);
if (!value.ok) {
return 1;
}
println("{} {}", duration.seconds, duration.nanoseconds);
println("{}", value.value);
return 0;
}
Resultado de la ejecución:
1 500000000
1500000000
Agregar tiempo y cambiar unidades
750 ms y 800 ms suman 1 segundo y 550000000 nanosegundos. En lugar de sumar segundos y nanosegundos por separado, puede usar checked_add para verificar el transporte y el alcance juntos.
import("std::time::duration")::{
Duration,
DurationResult,
DurationValueResult,
time_duration_from_ms,
time_duration_checked_add,
time_duration_to_ms
};
fun main() -> i32 {
var first: Duration = time_duration_from_ms(750);
var second: Duration = time_duration_from_ms(800);
var sum: DurationResult = time_duration_checked_add(first, second);
if (!sum.ok) {
return 1;
}
var milliseconds: DurationValueResult = time_duration_to_ms(sum.value);
if (!milliseconds.ok) {
return 2;
}
println("{}s {}ns", sum.value.seconds, sum.value.nanoseconds);
println("{}ms", milliseconds.value);
return 0;
}
Resultado de la ejecución:
1s 550000000ns
1550ms
intervalo de tiempo negativo
Duration también representa números negativos. -1ms se normaliza a seconds=-1, nanoseconds=999000000. Los dos campos combinados son 1 milisegundo negativo. No debes juzgar que es un número positivo con solo mirar el campo nanoseconds.
Los números negativos son válidos en los cálculos de intervalos de tiempo, pero pasar un número negativo a sleep es un error. A la hora de calcular el tiempo de espera restante, si el plazo ya ha transcurrido, se procederá al siguiente trámite sin esperas.
Seleccione hora API
| propósito | seleccionar | ¿Qué significan los resultados? |
|---|---|---|
| Tiempo transcurrido entre dos puntos en el tiempo | monotonic clock | Intervalo independiente de la corrección visual del sistema. |
| tiempo real del calendario | realtime clock | Hora establecida por el sistema. |
| Esperando programa sincrónico | time_sleep_ms |
El flujo de llamadas está en cola |
| async Esperando tarea | task::sleep_ms |
Pasar la oportunidad de ejecución a otra tarea |
Incluso un reloj que devuelve nanosegundos no significa que la precisión real de la medición sea de 1 nanosegundo. Al comparar el rendimiento, mida el tiempo total para repetir una tarea corta varias veces y mueva las tareas no relacionadas con el objetivo de medición, como entrada/salida, fuera de la sección.