C++ , Minuterie, Millisecondes
#include <iostream>
#include <conio.h>
#include <ctime>
using namespace std;
double diffclock(clock_t clock1,clock_t clock2)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
clock_t start = clock();
for(int i=0;;i++)
{
if(i==10000)break;
}
clock_t end = clock();
cout << diffclock(start,end)<<endl;
getch();
return 0;
}
Donc mon problème vient qu'il me renvoie un 0, bien être stright je veux vérifier combien de temps mon programme fonctionne...
J'ai trouvé des tonnes de conneries sur internet, ainsi la plupart du temps il s'agit de la même point d'obtenir un 0 car le début et la fin est la même
Ces problèmes va à C++ rappelez-vous : <
Hasard, votre optimizer est jeter votre boucle for car elle ne fait rien? Peut-être ajouter une affectation à un mondial à l'intérieur. Alos, même si elle fonctionne, vous avez le début et la fin vers l'arrière de sorte que le temps sera négatif.
Même si la boucle n'est pas optimisé, il ya une bonne chance que le comptage de 10000 prend moins d'une milliseconde. Les ordinateurs modernes sont assez rapide.
Pourquoi faites-vous cela? Si vous essayez de référence, la boucle est probablement pas un bon test.
Le temps requis pour exécuter le code entre
Vous disposez également d'un potentiel de division entière problème en fonction de la valeur de
Même si la boucle n'est pas optimisé, il ya une bonne chance que le comptage de 10000 prend moins d'une milliseconde. Les ordinateurs modernes sont assez rapide.
Pourquoi faites-vous cela? Si vous essayez de référence, la boucle est probablement pas un bon test.
Le temps requis pour exécuter le code entre
start
et end
0.Vous disposez également d'un potentiel de division entière problème en fonction de la valeur de
CLOCKS_PER_SEC
sur votre système de changement double diffms=(diffticks)/(CLOCKS_PER_SEC/1000)
à double diffms=diffticks/(CLOCKS_PER_SEC/1000.0)
.OriginalL'auteur Przmak | 2013-03-05
Vous devez vous connecter pour publier un commentaire.
Un coup d'œil, il semble que vous êtes en soustrayant la valeur la plus grande de la valeur la plus petite. Vous composez le:
Mais alors diffclock est défini comme:
En dehors de cela, il peut avoir quelque chose à voir avec la façon dont vous effectuez la conversion des unités. L'utilisation de 1000 pour convertir en millisecondes est différent sur cette page:
http://en.cppreference.com/w/cpp/chrono/c/clock
0 pour moi. vous?
+1. Aussi, considérez l'utilisation de cppreference à la place. Le cplus plus dot com est un site commercial complètement de l'ads. Cppreference est une communauté de pilote sur le wiki de référence qui est beaucoup plus à jour, et bien sûr sans publicité.
OriginalL'auteur
Il y a quelques problèmes ici. La première est que vous avez évidemment à commutation de démarrer et d'arrêter le temps lors du passage à
diffclock()
fonction. Le deuxième problème est l'optimisation. Tout raisonnablement intelligent compilateur avec les optimisations activées serait tout simplement jeter l'ensemble de la boucle de loin car il n'a pas d'effets secondaires. Mais même si vous résoudre les problèmes ci-dessus, le programme serait le plus susceptible d'imprimer 0. Si vous essayez d'imaginer de faire des milliards d'opérations par seconde, jeter sophistiqué de l'exécution des ordres, la prédiction et des tonnes d'autres technologies employées par les Processeurs modernes, même un CPU peut optimiser votre boucle de loin. Mais même si ce n'est pas le cas, vous auriez besoin d'un beaucoup plus que 10K itérations afin de le faire fonctionner plus longtemps. Vous auriez probablement besoin de votre programme à exécuter pendant une seconde ou deux afin d'obtenirclock()
reflètent rien.Mais le problème le plus important est
clock()
lui-même. Cette fonction n'est pas adapté pour tout le temps des mesures de la performance que ce soit. Ce qu'il fait est vous donne un rapprochement de temps processeur utilisé par le programme. Côté de la vague de la nature de la méthode d'approximation qui peut être utilisé par n'importe quel compte tenu de la mise en œuvre (depuis la norme ne l'exige pas de quelque chose de spécifique), POSIX norme exige également que lesCLOCKS_PER_SEC
être égale à1000000
indépendante de la résolution. En d'autres termes, peu importe le degré de précision de l'horloge est, il n'a pas d'importance à la fréquence de votre CPU est en cours d'exécution. Pour le mettre simplement, il est totalement inutile de nombre et donc totalement inutile de fonction. La seule raison pour laquelle il existe encore est probablement pour des raisons historiques. Donc, merci de ne pas l'utiliser.Pour obtenir ce que vous recherchez, les gens ont utilisé pour lire le Tampon de Temps PROCESSEUR également connu comme "RDTSC" par le nom du PROCESSEUR correspondant instruction utilisé pour le lire. Ces jours-ci, cependant, c'est aussi la plupart du temps inutile car:
Alors que faire?
Quand il s'agit de profilage, un outil comme
perf
doit être utilisé. Il permet de suivre un certain nombre de CPU horloges, les défauts de cache, de branches, les branches manqué, un certain nombre de fois que le processus a été déplacé d'un PROCESSEUR à l'autre, et ainsi de suite. Il peut être utilisé comme un outil, ou peut être intégré dans votre application (quelque chose comme PAPI).Et si la question est au sujet de temps réel passé, les gens utilisent une horloge murale. De préférence, une haute précision, c'est pas non plus un sujet de NTP ajustements (monotone). Que montre exactement combien de temps s'est écoulé, peu importe ce qui se passait. À cette fin
clock_gettime()
peut être utilisé. Il fait partie de SUSv2, POSIX.1-2001 standard. Étant donné que l'utilisation que vousgetch()
pour garder le terminal ouvert, je suppose que vous êtes à l'aide de Windows. Il y a, malheureusement, vous n'avez pasclock_gettime()
et la chose la plus proche serait compteurs de performance API:Pour une solution portable, le meilleur pari est sur
std::chrono::high_resolution_clock()
. Il a été introduit en C++11, mais est pris en charge par la plupart des industriels de qualité compilateurs (GCC, Clang, MSVC).Ci-dessous est un exemple de comment l'utiliser. Veuillez noter que depuis que je sais que mon CPU fait 10000 incréments d'un nombre entier de manière plus rapide que un millième de seconde, j'ai changé de microsecondes. J'ai aussi déclaré le compteur comme
volatile
dans l'espoir que le compilateur n'optimisent pas loin.Quand j'ai compiler et l'exécuter, il imprime:
Espère que cela aide. Bonne Chance!
OriginalL'auteur
Le problème semble être la boucle est juste trop court. Je l'ai essayé sur mon système et il a donné 0 tiques. J'ai vérifié ce que diffticks était et c'était de 0. L'augmentation de la boucle de taille à 100000000, donc il y avait un temps de latence et j'ai eu -290 de sortie (bug, je pense que le diffticks devrait être de 2-clock1 donc, nous devrions obtenir 290 et pas -290). J'ai essayé aussi de changer "1000" à "1000.0" dans la division et cela ne fonctionne pas.
De la compilation avec l'optimisation n'supprimer la boucle, de sorte que vous avez à ne pas l'utiliser, ou de faire la boucle "faire quelque chose", par exemple incrémenter un compteur d'autres que le compteur de la boucle dans le corps de la boucle. Au moins c'est ce que GCC ne.
+1 pour repérer un bug 🙂
OriginalL'auteur The_Sympathizer
Tout d'abord, vous devez soustraire la fin - début pas vice-versa.
La Documentation dit que si la valeur n'est pas disponible horloge() renvoie -1, avez-vous vérifier?
Ce niveau d'optimisation utilisez-vous lors de la compilation de votre programme? Si l'optimisation est activée compilateur peut éliminer efficacement votre boucle entièrement.
OriginalL'auteur Slava