假设我想测量某段代码所花费的时间。为此,我通常会做这样的事情
clock_t startTime = clock();
//do stuff
//do stuff
//do stuff
//do stuff
float secsElapsed = (float)(clock() - startTime)/CLOCKS_PER_SEC;
如果程序是多线程的,并且在我要测量的部分内发生了上下文切换,该怎么办?我如何衡量执行代码所花费的时间,排除在其他线程上花费的时间?即使有工具可以做到这一点,我也非常想知道他们正在做什么 。
答案 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。