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时间,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Јовић所建议的那样.但是,这种方法不允许您测量程序的各个部分(例如,执行函数所需的时间).
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使用上面的示例以秒为单位获取时间.
我在我的一个项目中使用过这样的东西:
#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++.
这是我使用的代码:
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)