如何衡量一段代码执行的时间?

时间:2011-09-21 09:36:51

标签: c++ multithreading profiling time-measurement

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

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

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

4 个答案:

答案 0 :(得分:4)

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

如果您对某些功能的相对性能感兴趣,profiler是唯一可行的方法。请注意,这将不再强调由于其引起的计算开销而阻塞I / O的影响。

如果你想要某些功能的clock-based time,那么有很多选项。

我个人认为gettimeofday就足够了。

如果您想精确,请使用RDTSC

如果你想让真的精确,你会想要这样的东西

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

从Linux终端使用'time path_to_app'

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

答案 3 :(得分:1)

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

我经常将这个想法用于剖析。我猜你甚至可以在多线程环境中使它工作。这需要一些工作,但我认为这不会那么困难。

请查看此问题以获取更多信息C++ Benchmark tool