le calcul du temps d'exécution en C ++
-
22-08-2019 - |
Question
Je l'ai écrit un programme C ++, je veux savoir comment calculer le temps nécessaire pour l'exécution, donc je ne vais pas dépasser le temps limite.
#include<iostream>
using namespace std;
int main ()
{
int st[10000],d[10000],p[10000],n,k,km,r,t,ym[10000];
k=0;
km=0;
r=0;
scanf("%d",&t);
for(int y=0;y<t;y++)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>st[i] >>d[i] >>p[i];
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if((d[i]+st[i])<=st[j])
{
k=p[i]+p[j];
}
if(k>km)
km=k;
}
if(km>r)
r=km;
}
ym[y]=r;
}
for( int i=0;i<t;i++)
{
cout<<ym[i]<<endl;
}
//system("pause");
return 0;
}
est mon programme et je veux que ce soit dans le délai de 3 sec !! comment faire ? ouais désolé, je voulais dire le temps d'exécution !!
La solution
Si vous avez Cygwin installé, à partir de son shell bash, exécutez votre exécutable, par exemple MyProgram
, en utilisant l'utilitaire time
, comme suit:
/usr/bin/time ./MyProgram
rapportera combien de temps l'exécution de votre programme a - la sortie ressemblerait à quelque chose comme ce qui suit:
real 0m0.792s
user 0m0.046s
sys 0m0.218s
Vous pouvez également modifier manuellement votre programme C pour instrument à l'aide de la fonction de bibliothèque clock()
, comme suit:
#include <time.h>
int main(void) {
clock_t tStart = clock();
/* Do your stuff here */
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;
}
Autres conseils
Avec C ++ 11 pour mesurer le temps d'exécution d'un morceau de code, on peut utiliser la fonction maintenant ():
auto start = chrono::steady_clock::now();
// Insert the code that will be timed
auto end = chrono::steady_clock::now();
// Store the time difference between start and end
auto diff = end - start;
Si vous voulez imprimer la différence de temps entre le début et la fin dans le code ci-dessus, vous pouvez utiliser:
cout << chrono::duration <double, milli> (diff).count() << " ms" << endl;
Si vous préférez utiliser nanosecondes, vous utiliserez:
cout << chrono::duration <double, nano> (diff).count() << " ns" << endl;
La valeur de la variable diff peut également être tronquée à une valeur entière, par exemple, si vous voulez que le résultat est exprimé:
diff_sec = chrono::duration_cast<chrono::nanoseconds>(diff);
cout << diff_sec.count() << endl;
VUE D'ENSEMBLE
Je l'ai écrit d'un simple bidouille sémantique pour cela en utilisant @AshutoshMehra
response. Vous code ressemble vraiment cette façon lisible!
MACRO
#include <time.h>
#ifndef SYSOUT_F
#define SYSOUT_F(f, ...) _RPT1( 0, f, __VA_ARGS__ ) // For Visual studio
#endif
#ifndef speedtest__
#define speedtest__(data) for (long blockTime = NULL; (blockTime == NULL ? (blockTime = clock()) != NULL : false); SYSOUT_F(data "%.9fs", (double) (clock() - blockTime) / CLOCKS_PER_SEC))
#endif
USAGES
speedtest__("Block Speed: ")
{
// The code goes here
}
SORTIE
Block Speed: 0.127000000s
Note: la question était à l'origine du temps de compilation, mais plus tard, il est apparu que l'OP signifiait vraiment temps d'exécution. Mais peut-être cette réponse sera toujours utile pour quelqu'un.
Pour Visual Studio: aller à Tools / Options / Projects and Solutions / VC++ Project Settings
et définir l'option Build Timing
à 'yes
'. Après que le temps de chaque construction sera affiché dans la fenêtre de sortie.
Cela ressemble à l'algorithme de Dijstra. Dans tous les cas, le temps nécessaire pour exécuter dépendra de N. Si cela prend plus de 3 secondes il n'y a aucune façon que je peux voir de l'accélérer, comme tous les calculs qu'il fait besoin d'être fait.
En fonction de ce problème que vous essayez de résoudre, il pourrait y avoir un algorithme plus rapide.
Je l'ai utilisé la technique dit plus haut, encore je trouve que le temps donné dans le code: blocs IDE était plus ou moins similaire au résultat obtained- (peut-être il sera différent peu micro secondes) ..