2014-09-14 1 views
-1

Je veux déterminer quel est le meilleur conteneur à utiliser pour certaines opérations, donc je dois vérifier le temps d'exécution d'un vecteur par rapport à une liste.Comment utiliser chrono pour déterminer le temps d'exécution

Les références en ligne ont été assez vagues ou trop complexes pour cette implémentation.

Toute aide sera appréciée

+1

Voulez-vous dire « Comment puis-je mesurer le temps en cours d'exécution » ou « comment puis-je mesurer le temps qu'il faut pour compiler »? En général, j'utilise une commande comme 'time myprog' ou' time g ++ {options} myprog.cpp' pour mesurer le temps - mais cela suppose une durée d'exécution raisonnablement longue - au moins une seconde ou deux. –

+0

Je ne pense pas que ce soit l'heure de * compilation * qui vous intéresse, mais celle de * run *? Et en général, vous prenez un instantané du temps avant que vous fassiez l'opération, et un autre quand l'opération est faite, alors vous vérifiez juste la différence entre les deux temps. –

+0

Comment aurais-je les heures de début et de fin respectives? – user3504476

Répondre

0

Si vous avez accès à un compilateur C++11,

#include <chrono> 
#include <iostream> 

int main() 
{ 
    std::chrono::steady_clock::time_point _start(std::chrono::steady_clock::now()); 
    // code you want to time here 
    std::chrono::steady_clock::time_point _end(std::chrono::steady_clock::now()); 

    std::cout << std::chrono::duration_cast<std::chrono::duration<double>>(
        _end - _start).count(); // in seconds, read more about std::chrono 
} 
+0

J'ai essayé mais j'ai reçu une tonne d'erreurs. J'ai le fichier d'en-tête mais il ne cesse de me le dire: 'std :: chrono' n'a pas été déclaré | – user3504476

+1

compiler avec '-std = C++ 11', fait partie de C++ 11 standard – vsoftco

0

Voilà comment je l'ai utilise:

#include <iostream> 
#include <chrono> 

    auto start = std::chrono::high_resolution_clock::now(); 
    ... code to measure here ... 
    auto diff = std::chrono::high_resolution_clock::now() - start; 
    auto t1 = std::chrono::duration_cast<std::chrono::nanoseconds>(diff); 
    std::cout << "Loop1: " << t1.count() << std::endl; 

Vous devrez compilez cela avec g++ -std=c++11, et aussi longtemps que vous avez un compilateur et une bibliothèque C++ 11 fonctionnant, cela devrait fonctionner.

+0

J'utiliserais' steady_clock' à la place, le 'high_resolution_clock' peut changer si on change l'heure du système pendant l'exécution, bien que probablement cette ne se produit jamais ... – vsoftco

+0

Pas quelque chose que je (ou mon système) fait très souvent ... Je m'attends à ce que l'horloge haute résolution, au moins sur certains systèmes, donne une résolution plus élevée, et au moins dans certains cas, c'est plus important. Mais j'avoue que je l'ai copié à partir d'un code que j'avais, sans trop réfléchir aux différentes sources d'horloge possibles et à leurs avantages/inconvénients. –

+0

Oui, je l'ai aussi utilisé avant high_resolution_clock, mais j'ai eu un problème quand j'ai dû chronométrer une simulation qui a pris 2 jours, et un gars a juste changé l'heure du mur. Et il semble que, comme vous l'avez dit, (bien que n'étant pas garanti par la norme), les deux ont la même précision. – vsoftco

0

Ceci est mon code actuel:

#include <iostream> 
#include <list> 
#include <vector> 
#include <chrono> 
#include <stdlib.h> 
#include <ctime> 

using namespace std; 

template <typename Container> 
void fill_container(Container& c, int n) 
{ 
int v; 

for(int i =0; i<n; i++) 
{ 
    v= rand() %12; 
    c.push_back(v); 
} 

} 

template<typename Container> 
void print(Container& c, ostream& out =cout) 
{ 
typename Container::iterator itr = c.begin(); 
cout << "now" ; 
while(itr!=c.end()) 
{ 
    out << *itr << endl; 
    itr++; 
} 

} 

template <typename Container> 
void removeOdd(Container& c) 
{ 
typename Container::iterator itr2 = c.begin(); 
while(itr2!= c.end()) 
{ 
     cout << *itr2 << endl; 
     if(*itr2 %2 != 0) 
     { 
      itr2 = c.erase(itr2); 
     } 
     itr2++; 
} 

} 

int main() 
{ 





//Timer ends 
std::chrono::steady_clock::time_point _start(std::chrono::steady_clock::now()); 
// code you want to time here 
vector<int> damn; 
fill_container(damn, 20); 
removeOdd(damn); 
print(damn); 
std::chrono::steady_clock::time_point _end(std::chrono::steady_clock::now()); 

std:: cout << std::chrono::duration_cast<std::chrono::duration<double>>(_end - _start).count(); 



return 0; 
} 
+0

Votre code fonctionne (sauf la faute de frappe le premier inclut que j'ai édité), juste s'assure que vous compiliez avec '-std = C++ 11' – vsoftco

+0

Comment fais-je exactement cela? Et merci pour l'aide – user3504476

+0

si vous utilisez 'g ++', compilez comme 'g ++ -std = C++ 11 program.cpp' – vsoftco

Questions connexes