7

假设我想测量一段代码所花费的时间。为此,我通常会做这样的事情

clock_t startTime = clock();
//do stuff
//do stuff
//do stuff
//do stuff
float secsElapsed = (float)(clock() - startTime)/CLOCKS_PER_SEC;

如果程序是多线程的并且上下文切换发生在我要测量的部分中怎么办?我将如何测量我的代码执行所需的时间,不包括在其他线程上花费的时间?即使有工具可以做到这一点,我也非常想知道他们是如何做到的

4

4 回答 4

4

有多种方法可以衡量代码执行所需的时间。

如果您对某些功能的相对性能感兴趣,那么探查器是唯一的方法。请注意,由于它引起的计算开销,这将不强调阻塞 I/O 的影响。

如果您想要某些功能的基于时钟的时间,有很多选项。

我个人会说gettimeofday就足够了。

如果要精确,请使用RDTSC

如果你想变得非常精确,你会想要这样的东西

t1 = rdtsc();
t2 = rdtsc();
my_code();
t3 = rdtsc();
my_code_time = (t3-t2) - (t2-t1)

您将需要重复此块以解决线程调度差异,并注意缓存效果。

于 2011-09-21T11:11:49.910 回答
2

这就是代码基准测试基本上很糟糕的原因——因为你知道它需要多长时间。诸如被操作系统抢占之类的事情充其量是不可预测的。使用专业的分析器,因为他们可能有代码可以处理这些问题,或者不打扰。写clock()风格的东西是完全没有意义的。

于 2011-09-21T11:14:38.303 回答
1

从 Linux 终端使用 'time path_to_app'

这将返回您想知道的所有内容。

于 2011-09-21T10:46:41.483 回答
1

我准备了两个非常简单的类。第一个 ProfileHelper 类在构造函数中填充开始时间,在析构函数中填充结束时间。第二类 ProfileHelperStatistic 是一个具有额外统计能力的容器(一个 std::multimap + 一些返回平均值、标准偏差和其他有趣内容的方法)。

I have used this idea often for profiling. I guess you could make it work even in a multi-thread environment. It will require a bit of work, but I don't think it will be so difficult.

Have a look at this question for more information C++ Benchmark tool.

于 2011-09-21T14:12:30.230 回答