pourquoi C clock() renvoie 0
J'ai quelque chose comme ceci:
clock_t start, end;
start=clock();
something_else();
end=clock();
printf("\nClock cycles are: %d - %d\n",start,end);
et j'ai toujours comme une sortie "cycles d'Horloge sont: 0 - 0"
Une idée de pourquoi cela se produit?
(Juste apporter un petit détail, le something_else() fonction effectue de gauche à droite en utilisant l'exponentiation montgomery représentation, d'ailleurs je ne sais pas pour sûr que le something_else() la fonction n'est en effet, certains n'est pas négligeable en temps.)
C'est sur Linux. Le résultat de la commande uname -a l'est:
Linux snowy.*****.ac.uk 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
Quel système d'exploitation utilisez-vous?
J'ai juste modifié la question d'ajouter ce détail!
J'ai vu beaucoup d'exemples sur internet où ils l'utilisent comme un int. Je vais vous donner lecture de votre lien bien, merci
J'ai juste modifié la question d'ajouter ce détail!
clock_t
n'est probablement pas un int
, donc %d
n'est pas appropriée. Voir cette question: stackoverflow.com/questions/1083142/....J'ai vu beaucoup d'exemples sur internet où ils l'utilisent comme un int. Je vais vous donner lecture de votre lien bien, merci
OriginalL'auteur eddy ed | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
clock
fonction ne prend pas en mesure de cycles d'horloge du CPU.C dit
clock
"renvoie le mise en œuvre de la meilleure approximation pour le processeurle temps utilisé par le programme depuis le début de la mise en œuvre définies par l'ère liées
seulement pour le programme d'invocation."
Si, entre deux successives
clock
vous appelle programme prend moins de temps qu'une unité de l'clock
fonction, vous pourriez obtenir0
.POSIX
clock
définit l'unité avecCLOCKS_PER_SEC
comme 1000000 (l'unité est de 1 microseconde).http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
À mesure des cycles d'horloge en x86/x64 vous pouvez utiliser inline assemblée afin de récupérer l'horloge compter de la CPU Time Stamp Counter registre
rdtsc
.Aussi, il est utile de noter que, si l'horloge() est une fonction de la norme C90, il y a des plates-formes où l'horloge() est techniquement pas pris en charge et est mis en œuvre pour toujours retourner -1.
OriginalL'auteur ouah
Je suppose que la raison en est que votre
something_else()
consomme si peu de temps qui dépassent la précision declock()
. J'ai essayé d'appelerclock()
deux fois et, par conséquent, à la foisstart
etend
est égale à zéro, mais le résultat est raisonnable quand je fais un peu de temps choses entre.Voici mon code de test extrait de:
Et le résultat sur mon ordinateur est:
Aussi, deux conseils:
something_else()
est beaucoup de temps, mais le compilateur peut simplement ignorer ces opérations (en particulier les boucles) car il pense que eux aussi dénué de sens.sizeof(clock_t)
sur votre plate-forme pour voir la taille declock_t
.doit être égal à zéro puisqu'il enregistre le temps écoulé depuis le début du programme, mais
end
ne doit PAS être zéro. À ma connaissance, il n'existe pas de drapeaux ou d'autres astuces sont nécessaires pour l'utilisation declock()
. BTW, quel est le résultat desizeof(clock_t)
sur votre plate-forme?+1 pour ne pas optimiser
-1 pour ne pas optimiser (non, je n'ai pas fait downvote).Si vous souhaitez empêcher l'appel de la fonction optimisée, utilisez simplement la fonction de retour de la valeur à quelque chose, par exemple l'imprimer à la fin du programme.
On n'a généralement pas de référence unoptimized code. 😉 Mais sérieusement, l'exemple de code n'est pas vraiment benchmarkable pour deux raisons. Tous les résultats ou les effets secondaires du calcul ne sont pas utilisés et le compilateur peut tout simplement supprimer. Même si c est utilisé plus tard, le compilateur peut précalculer la valeur finale, sans générer de boucles. Si on a voulu tester si l'horloge() fonctionne, il suffit d'appeler le sommeil(1).
OriginalL'auteur Jinghao Shi
Bien, voulez-vous le temps
something_else()
prend? Essayez ceci:Je ne pense pas que vous serez en mesure de mesurer de façon portable cycles d'horloge. Je ne pense pas qu'il y ait quelque chose à ce sujet dans le C ou POSIX standard.
ed, si vous voulez mesurer les cycles d'horloge, vous devez utiliser un analyseur logique, compteur de fréquence, ou un autre matériel outil de mesure relié à votre matériel.
Ou un matériel compteur, tel que le TSC moderne x86s.
Pourquoi
+ 0.5
ici?OriginalL'auteur Enrique Marcos
La bonne façon de l'utilisation de l'horloge() pour mesurer le temps serait:
C'est parce que clock_t n'est pas garanti d'être un int, ou tout autre type d'ailleurs.
start
etend
sont en train d'être égal à 0? Dans ce cas, la virgule flottante n'aide pasCe que je veux dire, c'est qu'ils pourraient ne pas être de type int, afin de les imprimer n'a pas de sens. La bonne façon de les utiliser est soustrayant deux des montants et en divisant par CLOCKS_PER_SEC. N'importe quoi d'autre n'est pas défini. Le code que j'ai donné fonctionne correctement indiquant le nombre de secondes écoulées.
OriginalL'auteur Guido
Vérifier la valeur de
CLOCKS_PER_SEC
danstime.h/clock.h
. Sur mon système, par exemple, ( Dev Cpp sur Windows 7 ) une simple1000
. Donc autant que mon programme est concerné, il ya plus de 1000 impulsions par seconde. Votresomething_else
serait exécuté en quelques microsecondes. Et doncclock()
renvoie zéro, à la fois avant et après l'appel de fonction.Sur mon système, lorsque je remplace votre
something_else
avec un temps de routine comme ce- Je obtenir
Sur l'une des boîtes de linux, je trouve le suivre dans
bits/time.h
Donc, ne considérez ceci avant d'analyser la valeur de retour de
clock()
OriginalL'auteur Pavan Manjunath
J'ai utilisé le petit programme ci-dessous pour enquêter sur les mur de temps de l'horloge et de temps PROCESSEUR.
Sur mon test de ce système imprime
CLOCKS_PER_SEC 1000000
CPU time usage resolutio
n semble être0.010000 seconds
gettimeofday modifié par
9634 uS
lorsque le temps CPU modifié par0.010000
gettimeofday résolution semble être 1 nous
OriginalL'auteur user3782374