Me encontré en la fuente de la función gmtime de Minix. Me interesó el bit que calculó el número de años desde la época. Aquí son las tripas de que bits:¿Por qué se implementa gmtime de esta manera?
http://www.raspberryginger.com/jbailey/minix/html/gmtime_8c-source.html
http://www.raspberryginger.com/jbailey/minix/html/loc__time_8h-source.html
#define EPOCH_YR 1970
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
int year = EPOCH_YR;
while (dayno >= YEARSIZE(year)) {
dayno -= YEARSIZE(year);
year++;
}
Parece que el algoritmo es O (n), donde n es la distancia desde la época. Además, parece que LEAPYEAR se debe calcular por separado para cada año – docenas de veces para las fechas actuales y muchas más para fechas muy lejanas en el futuro. Yo tenía el siguiente algoritmo para hacer lo mismo (en este caso desde la época ISO-9601 (año 0 = 1 antes de Cristo) en lugar de Unix Epoch):
#define CYCLE_1 365
#define CYCLE_4 (CYCLE_1 * 4 + 1)
#define CYCLE_100 (CYCLE_4 * 25 - 1)
#define CYCLE_400 (CYCLE_100 * 4 + 1)
year += 400 * (dayno/CYCLE_400)
dayno = dayno % CYCLE_400
year += 100 * (dayno/CYCLE_100)
dayno = dayno % CYCLE_100
year += 4 * (dayno/CYCLE_4)
dayno = dayno % CYCLE_4
year += 1 * (dayno/CYCLE_1)
dayno = dayno % CYCLE_1
Esto se ejecuta en O (1) para cualquier fecha , y parece que debería ser más rápido incluso para fechas razonablemente cercanas a 1970.
Entonces, suponiendo que los desarrolladores de Minix sean Smart People que lo hicieron por su Reason, y probablemente conozcan un poco más sobre C que yo , ¿por qué?
Parece * como debería ser más rápido. Debe pensar en su arquitectura y qué tan rápido son ciertas instrucciones como multiplicar y qué tan bueno es el pronosticador de rama que tiene (la mayoría es muy buena). @jim mcnamara tiene algunos resultados interesantes. – BobbyShaftoe