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

Posted

技术标签:

【中文标题】如何在 Linux 多线程环境中测量函数的总执行时间【英文标题】:How to measure total execution time of a function in Linux multithreaded environment 【发布时间】:2017-04-05 13:06:09 【问题描述】:

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

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

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

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

【问题讨论】:

“是否有其他方法可以在 Linux 中进行此测量”,clock_gettime 和 CLOCK_THREAD_CPUTIME_ID。 这听起来像XY problem. 你打算用你得到的值做什么?测量一个函数所花费的时间通常是有目的的。你的目的是什么?最好的方法应该是您的问题。 目的如下。我有一个处理数据流量的进程,然后这个流量通过回调函数传递给客户端,即它将在同一个进程中执行。我想测量服务器部分正在使用多少容量。我想到的一种方法是测量回调函数中花费的时间,然后从进程的总执行时间中减去它。 【参考方案1】:

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

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

通过比较 ru_utimeru_stime 中的内容,在函数运行之前和之后,您应该能够确定函数在 CPU 时间中累积了多少时间,用于当前运行的线程。

对所有螺纹起泡、冲洗、重复,然后将它们加起来。

【讨论】:

这将是一个很好的方法,但是当我尝试它时,我注意到我得到了毫秒而不是微秒的分辨率。那么开始时间和结束时间就有相同的值了。 根据elinux.org/…,Linux 内核以毫秒为单位跟踪 CPU 时间。 Linux 内核根本不会以如此高的粒度跟踪 CPU 时间。【参考方案2】:

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

记录性能数据

perf record <command>

然后用

进行分析
perf report

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

【讨论】:

【参考方案3】:

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

    使用性能分析软件,例如 Intel V-Tune 和 Intel Inspector,它们将利用硬件性能计数器

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

【讨论】:

以上是关于如何在 Linux 多线程环境中测量函数的总执行时间的主要内容,如果未能解决你的问题,请参考以下文章

linux 多线程信号处理总结

测量使用预编译库(C++、Linux)的程序的总 CPU 时间

如何测量 Linux 和 Windows 中函数的“用户”执行时间

如何测量多线程应用程序中的缓存性能?

linux perf 是不是准确测量多线程 C 程序的缓存未命中?

linux下多进程或者多线程编程的问题。新手,望指教!