如何在Linux多线程环境中测量函数的总执行时间

时间:2017-04-05 13:06:09

标签: c linux multithreading measurement

我想测量Linux中C函数的总时间。可以从不同的线程同时调用该函数,并且将花费的时间加在一起。如何从Linux进行此测量?我查看了clock()函数并计算函数开始和结束之间的差异。

我在Stackoverflow中的这个线程中找到了一个使用clock()的解决方案: How to measure total time spent in a function?

但据我所知,这还包括来自线程的CPU处理在测量期间执行一些其他功能。这是正确的假设吗?

还有其他方法可以在Linux中进行此测量吗?

3 个答案:

答案 0 :(得分:1)

您的问题表明您使用的是Linux。

您可以将getrusage(2)系统调用与RUSAGE_THREAD参数一起使用,这将为您提供当前正在运行的线程的累计统计信息。

通过比较函数运行之前和之后ru_utime以及ru_stime中的内容,您应该能够确定函数在CPU时间内累积的时间,对于当前正在运行的线程。

对所有线程进行泡沫,冲洗,重复,然后将它们添加起来。

答案 1 :(得分:0)

clock()gettimeofday()系列函数中获取时间有利于在两个后续调用之间获得精确的时间差,但不利于获得函数所花费的时间,因为操作的线程和进程重新安排系统和IO阻塞,没有任何保证您的线程/进程可以获得CPU直到完成其操作,因此您不能按时间间隔进行中继。 你有两个选择

  1. 使用将使用硬件性能计数器的英特尔V-Tune和英特尔检查器等分析软件

  2. 使用Realtime linux内核,使用FIFO调度程序调度进程并使用时差,在FIFO调度程序中没有人打断你的程序,所以你可以安全地使用时差作为函数花费的时间,使用clock(),gettimeofday ()或更精确的rdtsc

答案 2 :(得分:0)

性能分析的一个非常好的工具是perf(最近的Linux内核可用):

使用

记录效果数据
perf record <command>

然后用

分析它
perf report

使用调试符号编译程序以获得有用的结果。