在C ++中记录已用时间的正确方法

时间:2011-05-14 01:17:22

标签: c++ logging elapsedtime

我正在撰写一篇关于GPU在群集环境中加速的文章 为此,我在CUDA编程,这基本上是一个c ++扩展。 但是,由于我是一名c#开发人员,我不知道c ++的特殊性。

关于记录已用时间有一些问题吗?一些建议或博客阅读。

我最初的想法是做一个大循环并多次运行程序。 50~100,并记录每个经过的时间后制作一些速度图形。

3 个答案:

答案 0 :(得分:4)

根据您的需要,它可以像以下一样简单:

time_t start = time(NULL);
// long running process
printf("time elapsed: %d\n", (time(NULL) - start));

我想你需要告诉你如何计划记录(文件或控制台)以及你需要的精度(秒,ms,我们等)。 “时间”可以在几秒钟内完成。

答案 1 :(得分:3)

我建议使用boost timer library。它与平台无关,并且简单如下:

#include <boost/timer/timer.hpp>
boost::timer t;
// do some stuff, up until when you want to start timing
t.restart();
// do the stuff you want to time.
std::cout << t.elapsed() << std::endl;

当然t.elapsed()会返回一个可以保存到变量的双精度。

答案 2 :(得分:2)

time等标准功能的分辨率通常很低。是的,解决这个问题的一个好方法是多次运行测试并取平均值。请注意,由于隐藏的启动成本,前几次可能会超慢 - 尤其是在使用GPU等复杂资源时。

对于特定于平台的调用,请查看Windows上的QueryPerformanceCounter和OS X上的CFAbsoluteTimeGetCurrent。(我没有使用POSIX调用clock_gettime,但这可能值得一试。)

测量GPU性能非常棘手,因为GPU是运行单独指令的远程处理单元 - 通常在许多并行单元上运行。您可能希望访问Nvidia的CUDA Zone以获取各种资源和工具,以帮助衡量和优化CUDA代码。 (与OpenCL相关的资源也具有高度相关性。)

最终,你想看看你的结果在屏幕上的速度有多快,对吧?因此,拨打time可能足以满足您的需求。