L'interface actuellement recommandée pour Linux sous Linux (et POSIX en général) est clock_gettime. Voir la page de manuel.
clock_gettime(CLOCK_REALTIME, struct timespec *tp) // for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) // for CPU time
Mais lisez la page man. Notez que vous devez lier avec -lrt, car POSIX le dit, je suppose. Peut-être pour éviter les conflits de symboles dans -lc, pour les anciens programmes qui ont défini leur propre clock_gettime? Mais les bibliothèques dynamiques utilisent des symboles faibles ...
La meilleure fonction de sommeil est nanosleep. Il ne dérange pas avec des signaux ou des conneries comme le sommeil. Il est défini pour juste dormir, et ne pas avoir d'autres effets secondaires. Et cela vous indique si vous vous êtes réveillé tôt (par exemple à partir de signaux), vous n'avez donc pas besoin d'appeler une autre fonction temporelle.
Quoi qu'il en soit, vous allez avoir du mal à tester un représentant de quelque chose d'aussi court qu'un appel système. Il y a énormément de possibilités de variation. par exemple. le planificateur peut décider qu'un autre travail doit être fait (peu probable si votre processus vient de démarrer, vous n'aurez pas encore utilisé votre timelice). Le cache de l'UC (L2 et TLB) est facilement possible.
Si vous disposez d'une machine multicœur et d'un banc d'essai à un seul thread pour le code que vous optimisez, vous pouvez lui attribuer une priorité en temps réel sur l'un de vos cœurs. Assurez-vous de choisir le noyau qui ne gère pas les interruptions, sinon votre clavier (et tout le reste) sera verrouillé jusqu'à ce qu'il soit terminé. Utilisez taskset (pour l'épinglage à une CPU) et chrt (pour le réglage du prio en temps réel). Voir ce mail j'ai envoyé à gmp-devel avec cette astuce: http://gmplib.org/list-archives/gmp-devel/2008-March/000789.html
Oh oui, pour le moment le plus précis, vous pouvez utiliser rdtsc vous (sur x86/AMD64). Si vous n'avez pas d'autres appels système dans ce que vous faites, ce n'est pas une mauvaise idée. Prenez un cadre d'analyse comparative pour mettre votre fonction dans. GMP en a un assez décent. Il n'est peut-être pas bien configuré pour les fonctions de benchmarking qui ne sont pas dans GMP et qui s'appellent mpn_whatever. Je ne me souviens pas, et ça vaut le coup d'oeil.