La descomposición de un timestamp diario [0‥86399] en hora, minuto y segundo es una operación omnipresente en bibliotecas de fecha y hora, pero las implementaciones mayoritarias —desde el kernel de Linux y glibc hasta Go, CPython, OpenJDK, V8, Boost y musl— la resuelven mediante divisiones y módulos encadenados que introducen una larga cadena de dependencias y rondan los 16 ciclos de CPU en x86.
El artículo desgrana el problema paso a paso. Primero analiza el enfoque tradicional basado en hour = time / 3600, minute = rem / 60, second = rem % 60, donde cada resultado depende del anterior y no admite paralelismo. Luego examina la variante que calcula cada componente de forma independiente (V8, Boost, musl), que rompe parcialmente la cadena de dependencias pero acaba realizando más operaciones totales.
A partir de ahí introduce dos optimizaciones clave: las mul-shift de 32 bits —(u64)x * 71582789 >> 32 para dividir entre 60 y (u64)x * 1193047 >> 32 para dividir entre 3600, válidas dentro del rango diario— y la variante de Cassio Neri basada en “Faster Remainder by Direct Computation” (Lemire et al., 2019), que explota los bits altos y bajos del producto para obtener hora, minuto y segundo con sólo dos multiplicaciones encadenadas.
El autor reorganiza además el cálculo para que las dos cadenas críticas queden perfectamente balanceadas y paralelizables por un procesador superescalar, eliminando los cuellos de botella. Aunque las.mul-shift pueden resultar poco legibles, ofrecen ganancias notables de latencia en x86, ARM y algunas arquitecturas SIMD, especialmente en bucles de procesamiento masivo de timestamps.
