Je suis arrivé à travers la source pour la fonction gmtime de Minix. Je me suis intéressé au bit qui a calculé le nombre d'année depuis des jours depuis l'époque. Voici le courage de ce petit:Pourquoi gmtime est-il implémenté de cette façon?
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++;
}
Il ressemble à l'algorithme est O (n), où n est la distance de l'époque. En outre, il semble que LEAPYEAR doit être calculé séparément pour chaque année – des dizaines de fois pour les dates actuelles et beaucoup d'autres pour les dates loin dans le futur. J'ai eu l'algorithme suivant pour faire la même chose (dans ce cas, de l'époque ISO-9601 (année 0 = 1 BC) plutôt que l'époque UNIX):
#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
Cela va dans O (1) pour toute date Donc, en supposant que les développeurs de Minix sont des gens intelligents qui ont fait leur chemin pour une raison, et en savent probablement un peu plus sur C que je ne le fais. , Pourquoi?
Il semble que cela devrait être plus rapide. Vous devez penser à votre architecture et à la vitesse à laquelle certaines instructions comme multiplier sont et à quel point un prédicteur de branche est bon (la plupart sont très bonnes). @jim mcnamara a des résultats intéressants. – BobbyShaftoe