衡量一个C ++代码的运行时间?

我想测量我的C ++代码的运行时间。 执行我的代码大约需要12个小时,而且我想在我的代码执行结束时写这个时间。 我怎样才能在我的代码?

操作系统:Linux

如果您正在使用C ++ 11,则可以使用system_clock::now()

 auto start = std::chrono::system_clock::now(); /* do some work */ auto end = std::chrono::system_clock::now(); auto elapsed = end - start; std::cout << elapsed.count() << '\n'; 

您还可以指定用于表示持续时间的粒度:

 // this constructs a duration object using milliseconds auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); // this constructs a duration object using seconds auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(end - start); 

如果你不能使用C ++ 11,那么看看Boost的chrono。

使用这样一个标准库最好的方面是可移植性非常高(例如,它们都可以在Linux和Windows上运行)。 所以如果你决定在之后移植你的应用程序,你不需要太担心。

这些库也遵循一个现代的C ++设计,而不是C类的方法。

编辑:上面的例子可以用来测量挂钟时间 。 但是,这并不是衡量程序执行时间的唯一方法。 首先,我们可以区分用户和系统时间:

  • 用户时间:程序在用户空间中运行的时间。
  • 系统时间:程序在系统(或内核)空间中运行的时间。 程序进入内核空间,例如执行系统调用时 。

根据目标,可能有必要或不要将系统时间视为程序执行时间的一部分。 例如,如果目标是仅仅测量用户代码的编译器优化,那么最好省去系统时间。 另一方面,如果用户想要确定系统调用是否是一个很大的开销,那么也需要测量系统时间。

而且,由于大多数现代系统是分时的 ,所以不同的程序可能竞争多个计算资源(例如,CPU)。 在这种情况下,可以做出另外的区分:

  • 挂钟时间 :通过使用挂钟时间,程序执行的测量方法与使用外部(挂钟)时钟相同。 这种方法不考虑程序之间的交互。
  • CPU时间 :在这种情况下,我们只计算一个程序实际在CPU上运行的时间。 如果一个程序(P1)与另一个程序(P2)共同调度,并且我们希望获得P1的CPU时间,则此方法不包括P2正在运行的时间,并且P1正在等待CPU(而不是挂钟时间方法)。

为了测量CPU时间,Boost 包含一组额外的时钟 :

  • process_real_cpu_clock ,捕获当前进程花费的挂钟CPU时间。
  • process_user_cpu_clock ,捕获当前进程花费的用户CPU时间。
  • process_system_cpu_clock ,捕获当前进程花费的系统CPU时间。 一个类似元组的类process_cpu_clock ,它们一起捕获真实的,用户CPU和系统CPU的处理时间。
  • thread_clock线程稳定时钟,给出当前线程所花费的时间(当由平台支持时)。

不幸的是,C ++ 11没有这样的时钟。 但Boost是一个广泛使用的库,可能这些额外的时钟将在某些时候被整合到C ++ 1x中。 所以,如果你使用Boost,你将会在新的C ++标准添加它们的时候做好准备。

最后,如果你想测量一个程序从命令行执行的时间(而不是在你的程序中加入一些代码),你可以看一下time命令,就像@BЈовић所说的那样。 但是,这种方法不会让你测量程序的各个部分(例如,执行一个函数所需的时间)。

使用std::chrono::steady_clock而不是std::chrono::system_clock std::chrono::steady_clock std::chrono::system_clock来测量C ++ 11中的运行时间。 原因是(引用system_clock的文档):

在大多数系统中,系统时间可随时调整

而steady_clock是单调的,更适合测量时间间隔:

类std :: chrono :: steady_clock表示单调时钟。 这个时钟的时间点不能随着物理时间的推移而减少。 这个时钟与挂钟时间无关,最适合测量间隔时间。

这是一个例子:

 auto start = std::chrono::steady_clock::now(); // do something auto finish = std::chrono::steady_clock::now(); double elapsed_seconds = std::chrono::duration_cast< std::chrono::duration<double> >(finish - start).count(); 

一个小的实用提示:如果你正在测量运行时间,并想报告秒数std::chrono::duration_cast<std::chrono::seconds>很少是你需要的,因为它给你秒的时间。 要以秒为单位获得时间,请使用上面的示例。

你可以用时间来开始你的程序。 当它结束时,它打印有关程序运行的好时间统计信息。 配置打印内容很简单。 默认情况下,它会打印用户和CPU执行程序的时间。

编辑:请注意,从代码中的每一个措施是不正确的,因为您的应用程序将被其他程序阻止,因此给你错误的值*

*通过错误的值,我的意思是很容易获得执行程序的时间,但是这个时间根据程序执行期间的CPU负载而变化。 为了获得相对稳定的时间测量,不依赖于CPU负载,可以使用时间执行应用程序,并使用CPU作为测量结果。

我在我的一个项目中使用了这样的东西:

 #include <sys/time.h> struct timeval start, end; gettimeofday(&start, NULL); //Compute gettimeofday(&end, NULL); double elapsed = ((end.tv_sec - start.tv_sec) * 1000) + (end.tv_usec / 1000 - start.tv_usec / 1000); 

这是毫秒,它适用于C和C ++。