2014-09-14 3 views
-1

Я хочу определить, какой контейнер лучше использовать для определенных операций, поэтому я должен проверить время выполнения вектора по сравнению с списком.Как использовать chrono для определения времени выполнения

Референции онлайн были довольно неопределенными или слишком сложными для этой реализации.

Любая помощь будет оценена

+1

ли вы имеете в виду «Как измерить время исполнения» или «как я могу оценить время, необходимое для компиляции»? Как правило, я использую команду как 'time myprog' или' time g ++ {options} myprog.cpp' для измерения времени, но это предполагает, что это достаточно продолжительное время выполнения - по крайней мере, второй или второй. –

+0

Я не думаю, что это время * компиляции, которое вас интересует, но время * запуска *? И вообще, вы делаете снимок времени до того, как выполняете операцию, а другой, когда операция завершена, вы просто проверяете разницу между двумя моментами. –

+0

Как мне получить время начала и окончания? – user3504476

ответ

0

В случае, если у вас есть доступ к 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

Я пробовал это, но получаю массу ошибок. У меня есть заголовочный файл , но он продолжает говорить мне: «std :: chrono» не был объявлен | – user3504476

+1

скомпилировать с '-std = C++ 11', является частью стандарта C++ 11 – vsoftco

0

Это, как я его использовать:

#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; 

Вы должны скомпилируйте это с помощью g++ -std=c++11 и до тех пор, пока у вас есть рабочий компилятор и библиотека C++ 11, которые должны работать.

+0

Вместо этого я бы использовал' stable_clock', 'high_resolution_clock' может измениться, если изменить время системы во время выполнения, хотя, вероятно, это никогда не бывает ... – vsoftco

+0

Не то, что я (или моя система) делает очень часто ... Я ожидаю, что часы с высоким разрешением, по крайней мере, на некоторых системах, дают более высокое разрешение и, по крайней мере, в некоторых случаях, это более важно. Но я признаю, что просто скопировал это из некоторого кода, который у меня был, не задумываясь о том, какими могут быть разные источники синхронизации, и их преимущества/недостатки. –

+0

Да, я также использовал до high_resolution_clock, но имел проблему, когда мне приходилось время симуляции, которая занимала 2 дня, а какой-то парень просто изменил время стены. И кажется, что, как вы сказали, (хотя и не гарантируется стандартом), обе имеют одинаковую точность. – vsoftco

0

Это мой текущий код:

#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

Ваш код работает (за исключением опечатки на первое, что я редактировал), просто убедитесь, что вы скомпилируете с помощью '-std = C++ 11' – vsoftco

+0

Как именно я это делаю? И спасибо за помощь – user3504476

+0

, если вы используете 'g ++', компилируете как 'g ++ -std = C++ 11 program.cpp' – vsoftco