测量C++代码的运行时间?

pea*_*man 31 c++ linux

我想测量我的C++代码的运行时.执行我的代码大约需要12个小时,我想在执行代码时写下这段时间.我怎么能在我的代码中做到这一点?

操作系统:Linux

bet*_*ido 77

如果您使用的是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';
Run Code Online (Sandbox Code Playgroud)

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

// 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);
Run Code Online (Sandbox Code Playgroud)

如果您不能使用C++ 11,然后看看时辰从升压.

使用这种标准库的最好的事情是它们的可移植性非常高(例如,它们都可以在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Јовић所建议的那样.但是,这种方法不允许您测量程序的各个部分(例如,执行函数所需的时间).

  • 我在这里投了反对票,因为使用系统时钟来测量持续时间总是错误的。如果无法使用 C++11,请使用“std::chrono::steady_clock”或“clock_gettime()”。从来没有系统时钟。它是为完全不同的目的而设计的,并不旨在稳定或单调增加,因此不适合此目的。曾经。另一个答案更好。 (4认同)
  • @loldop我相信C++ 11实现是Boost计时库的一个子集.所以他们应该有一个非常相似的API(如果不相同).使用C++ 11的好处是你不需要使用Boost(如果chrono是你想要的唯一Boost库). (2认同)
  • `system_clock` 可以跳跃(由于用户更改系统时间、NTP 调整时钟、插入闰秒)。它对于时间间隔的测量没有用。 (2认同)

vit*_*aut 29

在C++ 11中使用std::chrono::steady_clock而不是std::chrono::system_clock测量运行时间.原因是(引用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();
Run Code Online (Sandbox Code Playgroud)

一个小实用提示:如果您正在测量运行时间并且想要报告秒数std::chrono::duration_cast<std::chrono::seconds>很少是您需要的,因为它可以提供整数秒.double使用上面的示例以秒为单位获取时间.


BЈо*_*вић 10

您可以使用时间来启动您的程序.当它结束时,它会打印关于程序运行的美好时间统计信息.可以轻松配置要打印的内容.默认情况下,它会打印执行程序所花费的用户和CPU时间.

编辑:请注意代码中的每个度量都不正确,因为您的应用程序将被其他程序阻止,因此给您错误的值*.

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

  • @betabandido:如果您按照建议使用"时间",则无需做出决定.它报告经过的时间和CPU时间. (2认同)

Kji*_*jir 9

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

#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);
Run Code Online (Sandbox Code Playgroud)

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


Tim*_*mmm 5

这是我使用的代码:

  const auto start = std::chrono::steady_clock::now();

  // Your code here.

  const auto end = std::chrono::steady_clock::now();
  std::chrono::duration<double> elapsed = end - start;
  std::cout << "Time in seconds: " << elapsed.count() << '\n';
Run Code Online (Sandbox Code Playgroud)

你不想使用,std::chrono::system_clock因为它不单调!如果用户在代码中间更改时间,您的结果将是错误的 - 甚至可能是负值。std::chrono::high_resolution_clock可能会使用std::chrono::system_clock所以我也不推荐这样做。

这段代码还避免了丑陋的强制转换。


小智 5

如果你想用 printf() 打印测量的时间,你可以使用:

auto start = std::chrono::system_clock::now();
/* measured work */
auto end = std::chrono::system_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
printf("Time = %lld ms\n", static_cast<long long int>(elapsed.count()));
Run Code Online (Sandbox Code Playgroud)