2010-11-21 5 views
4

Je suis dans la situation suivante:Plus exact équivalent pour la commande "time" sous Linux, en ce qui concerne sys- et usertime?

Je veux déterminer le sys- et l'utilisateur de petits morceaux de code (PHP et C++). Évidemment, je pourrais utiliser le binaire "time" sous Linux, mais étant donné que ces snippets s'exécutent si vite, la sortie normale (ou même verbeuse) de "time" ne suffira pas à mon but. La précision de "temps" va en millisecondes, alors que j'ai besoin de microsecondes. Ou encore mieux: nanosecondes.

Quelqu'un peut-il me diriger vers un logiciel qui peut le faire pour moi? J'ai trouvé des trucs pour walltime, mais c'est le système et l'heure qui m'intéresse.

Merci d'avance!

BTW: Im Ubuntu fonctionnement 10.10 64 bits

Répondre

3

Il n'existe aucune méthode qui vous donnera un équivalent de sys ou usertime tel que rapporté par la commande time qui sera plus précise. Une grande partie de la précision apparente de la commande time est une fausse précision telle qu'elle est.

La technique pour gérer cela est de mettre ces bribes de code dans des boucles serrées qui les appellent des milliers de fois et de déterminer combien de temps une boucle donnée prend de cela. Et même alors, vous devriez répéter l'expérience plusieurs fois et choisir le temps le plus bas.

Voici une analogie décrivant pourquoi la précision est fausse, et ce que je veux dire par là. Supposons que quelqu'un utilise un chronomètre pour chronométrer une course en appuyant manuellement sur le bouton au début de la course et lorsque la personne chronométrée franchit la ligne d'arrivée. Apparemment, votre chronomètre est précis au 100e de seconde. Mais cette précision est fausse car elle est éclipsée par les erreurs introduites par le temps de réaction de la personne qui touche le bouton. Ceci est assez similaire à la raison pour laquelle time vous donne une précision qui est censée être en microsecondes, mais qui est nettement moins précise. Il se passe beaucoup de choses dans un système donné à un moment donné, et toutes ces choses introduisent une erreur dans les calculs. Les interruptions de l'E/S du réseau, ou de l'E/S du disque, interrompent la temporisation pour l'exécution du planificateur, ce que les autres processus font au cache de l'UC L1 ou L2. Tout cela s'additionne. L'utilisation de quelque chose comme valgrind qui exécute votre programme sur une CPU simulée peut vous donner des nombres qui sont apparemment précis au nombre de cycles CPU. Mais cette précision n'est pas ce que vous allez vivre dans le monde réel. Il est préférable d'utiliser la technique que j'ai décrite à l'origine et j'accepte simplement que ces horaires peuvent être flous.

+0

Wow, merci pour la réponse rapide et verbeuse! – Stobbej

+0

J'étais conscient du fait qu'à un moment donné, beaucoup de processus sont en cours d'exécution, c'est pourquoi j'ai demandé le sys- et l'usertime. Pour ces numéros vous donne le temps que le processeur est en train de traiter votre appel, n'est-ce pas? Je réalise que maintenant je ne serai pas capable d'obtenir plus de précision avec une seule mesure, donc je vais essayer la solution en boucle! – Stobbej

+0

@Stobbej - Oui, ces deux nombres sont censés représenter le temps que le processeur passe spécifiquement sur votre processus. Mais, étrangement, cela les rend encore moins précis. Ce n'est pas vraiment facile de mesurer cela de façon définitive. – Omnifarious

0

gettimeofday() vous donnera micro-deuxième résolution.

0

clock_gettime() vous donnera une résolution d'une nanoseconde.