Question

En ce moment je suis le chargement d'un fichier puis en utilisant gettimeofday et le suivi du temps CPU avec tv_usec

Mes résultats varient, je reçois 250 à 280s de mais parfois 300 ou 500 de son. J'ai écrit usleep et le sommeil (0) et (1) sans succès. Le temps varie encore énormément. Je pensais que le sommeil (1) (secondes linux, pas les fenêtres de sommeil en ms) aurait résolu. Comment puis-je garder trace du temps d'une manière plus cohérente pour les tests? Peut-être que je devrais attendre d'avoir beaucoup plus de données de test et le code plus complexe avant de commencer les mesures?

Était-ce utile?

La solution

L'interface actuellement recommandée pour le temps de haut sur Linux rez (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 de manuel. Notez que vous devez -lrt, parce que 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 libs dynamiques utilisent des symboles faibles ...

La meilleure fonction de sommeil est nanosleep. Il ne plaisante pas avec les signaux ou une merde comme usleep. Il est défini dormir juste, et ne pas avoir d'autres effets secondaires. Et il vous indique si vous me suis réveillé tôt (par exemple des signaux), de sorte que vous ne devez pas nécessairement appeler une autre fonction du temps.

De toute façon, vous allez avoir du mal à tester un représentant de quelque chose qui court qui implique un appel système. Il y a une énorme quantité de possibilités de variation. par exemple. le planificateur peut décider que certains besoins de travail d'autres faire (peu probable si le processus vient de commencer, vous pas encore utilisé votre timeslice). cache du processeur (L2 et TLB) sont facilement possibles.

Si vous avez une machine multi-core et une référence à thread unique pour le code que vous optimisez, vous pouvez donner la priorité en temps réel épinglé à un de vos cœurs. Assurez-vous de choisir le noyau qui ne gère pas les interruptions ou votre clavier (et tout le reste) est verrouillé jusqu'à ce qu'il soit fait. Utilisez taskset (pour goupiller à une unité centrale de traitement) et chrt (pour régler prio en temps réel). Voir ce mail j'ai envoyé à gmp-devel avec cette astuce: http://gmplib.org/list-archives/gmp- devel / 2008-Mars / 000789.html

Ah oui, pour le moment le plus précis, vous pouvez utiliser rdtsc vous (sur x86 / AMD64). Si vous n'avez pas d'autres syscalls dans ce que vous bench, ce n'est pas une mauvaise idée. Prenez un cadre de référence pour mettre votre fonction dans. GMP a un assez décent. Il est peut-être pas mis en place bien pour la comparaison des performances qui ne sont pas GMP et a appelé mpn_whatever, cependant. Je ne me souviens pas, et ça vaut le coup d'oeil.

Autres conseils

Êtes-vous essayer de mesurer le temps qu'il faut pour charger un fichier? En général, si vous êtes tester les performances un certain morceau de code qui est déjà assez rapide (sous-seconde), alors vous voulez répéter le même code un certain nombre de fois (disons mille ou un million), le temps l'ensemble du lot, puis diviser le temps total par le nombre d'itérations.

Cela dit, je ne suis pas tout à fait sûr de ce que vous utilisez sleep () pour. Pouvez-vous poster un exemple de ce que vous avez l'intention de le faire?

Je recommande de mettre ce code dans une boucle. Lancez-le sur 1000 ou 10000 itérations. Il y a des problèmes avec cela si vous faites quelques instructions, mais il devrait aider.

grands ensembles de données aussi bien sûr l'aide.

sommeil va deschedule votre fil du cpu. Il ne compte pas avec précision le temps avec précision.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top