Измерение времени выполнения функции в C ++

Я хочу узнать, сколько времени занимает определенная функция в моей программе на C ++ для работы в Linux . Впоследствии я хочу сделать сравнение скорости. Я видел несколько функций времени, но в итоге получил это от повышения. Chrono:

process_user_cpu_clock, captures user-CPU time spent by the current process 

Теперь я не понимаю, использую ли я вышеупомянутую функцию, получаю ли я только время, затрачиваемое процессором на эту функцию?

Во-вторых, я не мог найти никакого примера использования указанной выше функции. Может ли кто-нибудь помочь мне, как использовать вышеуказанную функцию?

PS: Сейчас я использую std::chrono::system_clock::now() чтобы получить время в секундах, но это дает мне разные результаты из-за разной загрузки процессора каждый раз.

Это очень простой в использовании метод в C ++ 11. Вы должны использовать std::chrono::high_resolution_clock из заголовка .

Используйте его так:

 #include  #include  using namespace std; using namespace std::chrono; void function() { long long number = 0; for( long long i = 0; i != 2000000; ++i ) { number += 5; } } int main() { high_resolution_clock::time_point t1 = high_resolution_clock::now(); function(); high_resolution_clock::time_point t2 = high_resolution_clock::now(); auto duration = duration_cast( t2 - t1 ).count(); cout << duration; return 0; } 

Это будет измерять продолжительность функции.

ПРИМЕЧАНИЕ. Требование не всегда получать одинаковый вывод всегда, потому что процессор вашего компьютера может быть меньше или больше использован другими процессами, запущенными на вашем компьютере. Поскольку вы решаете математическое упражнение, ваш ум может быть более или менее сосредоточен, поэтому вы будете решать это в разное время. В человеческом разуме мы можем вспомнить решение математической проблемы, хотя для компьютера такой же процесс всегда будет чем-то новым, поэтому, как я сказал, не обязательно всегда получать тот же результат!

Вот функция, которая будет измерять время выполнения любой функции, переданной как аргумент:

 #include  #include  typedef std::chrono::high_resolution_clock::time_point TimeVar; #define duration(a) std::chrono::duration_cast(a).count() #define timeNow() std::chrono::high_resolution_clock::now() template double funcTime(F func, Args&&... args){ TimeVar t1=timeNow(); func(std::forward(args)...); return duration(timeNow()-t1); } 

Пример использования:

 #include  #include  typedef std::string String; //first test function doing something int countCharInString(String s, char delim){ int count=0; String::size_type pos = s.find_first_of(delim); while ((pos = s.find_first_of(delim, pos)) != String::npos){ count++;pos++; } return count; } //second test function doing the same thing in different way int countWithAlgorithm(String s, char delim){ return std::count(s.begin(),s.end(),delim); } int main(){ std::cout<<"norm: "< 

Вывод:

 norm: 15555 algo: 2976 

простая программа для поиска времени выполнения функции.

 #include  #include  // time_t #include  void function() { for(long int i=0;i<1000000000;i++) { // do nothing } } int main() { time_t begin,end; // time_t is a datatype to store time values. time (&begin); // note time before execution function(); time (&end); // note time after execution double difference = difftime (end,begin); printf ("time taken for function() %.2lf seconds.\n", difference ); return 0; } 

Вот отличный шаблон classа только для заголовка, чтобы измерить прошедшее время функции или любого кодового блока:

 #ifndef EXECUTION_TIMER_H #define EXECUTION_TIMER_H template class ExecutionTimer { public: using Clock = std::conditional_t; private: const Clock::time_point mStart = Clock::now(); public: ExecutionTimer() = default; ~ExecutionTimer() { const auto end = Clock::now(); std::ostringstream strStream; strStream << "Destructor Elapsed: " << std::chrono::duration_cast( end - mStart ).count() << std::endl; std::cout << strStream.str() << std::endl; } inline void stop() { const auto end = Clock::now(); std::ostringstream strStream; strStream << "Stop Elapsed: " << std::chrono::duration_cast(end - mStart).count() << std::endl; std::cout << strStream.str() << std::endl; } }; // ExecutionTimer #endif // EXECUTION_TIMER_H 

Вот некоторые из них:

 int main() { { // empty scope to display ExecutionTimer's destructor's message // displayed in milliseconds ExecutionTimer timer; // function or code block here timer.stop(); } { // same as above ExecutionTimer timer; // code block here... timer.stop(); } { // same as above ExecutionTimer timer; // code block here... timer.stop(); } { // same as above ExecutionTimer timer; // code block here... timer.stop(); } return 0; } 

Поскольку class является шаблоном, мы можем легко определить, как мы хотим, чтобы наше время измерялось и отображалось. Это очень удобный шаблон classа утилит для выполнения настольной маркировки и очень прост в использовании.

Простой способ для старых C ++ или C:

 #include  // includes clock_t and CLOCKS_PER_SEC int main() { clock_t start, end; start = clock(); // ...code to measure... end = clock(); double duration_sec = double(end-start)/CLOCKS_PER_SEC; return 0; } 

Точность синхронизации в секундах – 1.0/CLOCKS_PER_SEC

Давайте будем гением компьютера.