Conversion millisecondes en secondes en C

Simple question C, comment puis-je convertir correctement et succinctement millisecondes en secondes. Il y a deux contraintes:

Cela devrait marcher

 int sec = ((msec + 500) / 1000); 
 int seconds = msec / 1000; if (msec % 1000 > 500) seconds++; 

Au début, je ne voulais pas écrire cette réponse après les tests sur x86, mais les tests sur sparc Solaris montraient que la performance était supérieure à celle de la “solution évidente”. Elle serait donc peut-être utile à quelqu’un. Je l’ai tiré d’ un PDF qui accompagne le livre Hacker’s Delight . La voici:

 unsigned msec2sec(unsigned n) { unsigned q, r, t; n = n + 500; t = (n >> 7) + (n >> 8) + (n >> 12); q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14); q = q >> 9; r = n - q*1000; return q + ((r + 24) >> 10); } 

par opposition à:

 unsigned msec2sec_obvious(unsigned n) { return (n + 500)/1000; } 

Sur x86, “l’algorithme évident” se traduit par l’ajout de 500, puis d’une longue multiplication par 274877907, suivies de l’extraction des 32 bits les plus significatifs d’edx et de leur décalage de 6 bits vers la droite. différence).

Cependant, sous Solaris / sparc, l ‘”évidence” se transforme en un appel à .udiv, ce qui aboutit à une différence de performances d’environ 2,5 fois la performance dans une autre direction.