37 / Avanzado

Sleep y Temporizadores

time_ms() retorna una marca de tiempo monotónica en milisegundos como int. Restar dos lecturas da una duración transcurrida. sleep(ms) suspende el hilo actual por la cantidad de milisegundos especificada.

37-sleep-timer.nxFuente →
// Timer y sleep: medir tiempo transcurrido con time_ms() y pausar con sleep()

fn main() -> int {
    print("start")

    let t0: int = time_ms()

    // Pausar 500 milisegundos
    sleep(500)

    let t1: int = time_ms()
    let elapsed: int = t1 - t0

    print("500ms passed")
    print("tiempo real: " + int_to_string(elapsed) + "ms")

    // Medir una operacion costosa
    let t2: int = time_ms()
    var suma: int = 0
    var i: int = 0
    while i < 1000000 {
        suma = suma + i
        i = i + 1
    }
    let t3: int = time_ms()
    let dur: int = t3 - t2
    print("suma de 0..1M = " + int_to_string(suma))
    print("duracion loop: " + int_to_string(dur) + "ms")

    return 0
}
Salida ilustrativastdout
start
500ms passed
tiempo real: 500ms
suma de 0..1M = 499999500000
duracion loop: 0ms

Cómo funciona

time_ms() es un envoltorio liviano sobre el reloj del sistema, que retorna una marca de tiempo monotónica en milisegundos adecuada para medir duraciones. Tomar la diferencia t1 - t0 después de un sleep(500) debería producir un valor igual o apenas por encima de 500, dependiendo de la precisión del planificador del sistema operativo.

La segunda medición envuelve un loop ajustado que suma enteros de 0 a 999 999. El resultado — 499 999 500 000 — es la suma estándar de la serie aritmética n*(n-1)/2 para n = 1 000 000. La duración se redondea a cero porque LLVM optimiza el loop de forma agresiva al momento de generar código nativo.

Tanto time_ms como sleep son funciones integradas disponibles sin necesidad de ningún import. Están implementadas en el runtime y se mapean directamente a clock_gettime(CLOCK_MONOTONIC) y nanosleep en Linux.