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



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

我在 Stackoverflow 中的此线程中使用 clock() 找到了一种解决方案:如何衡量在函数中花费的总时间?

但据我了解,这也将包括在测量期间从线程执行其他一些功能的 CPU 处理。这是一个正确的假设吗?

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

您的问题表明您正在使用Linux。

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

通过比较函数运行前后ru_utime中的内容,也许还有ru_stime,您应该能够确定函数在当前正在运行的线程的 CPU 时间中累积了多少时间。

起泡,冲洗,重复所有线程,然后将它们加起来。

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

使用 记录性能数据

perf record <command>

然后用

perf report

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

clock()gettimeofday()系列函数中获取时间有利于在两个后续调用之间获得精确的时差,但不利于获取在函数中花费的时间,因为操作系统的线程和进程重新调度和 IO 阻塞,无法保证您的线程/进程可以在完成其操作之前获得 CPU, 所以你不能在时差上中继。您有两种选择

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

  2. 使用实时linux内核,使用FIFO调度程序调度进程并使用时差,在
  3. FIFO调度器中没有人中断您的程序,因此您可以安全地使用时差作为在函数中花费的时间,使用clock((,gettimeofday((甚至更精确的rdtsc

最新更新