如何在 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_utime
和 ru_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 多线程环境中测量函数的总执行时间的主要内容,如果未能解决你的问题,请参考以下文章
测量使用预编译库(C++、Linux)的程序的总 CPU 时间
如何测量 Linux 和 Windows 中函数的“用户”执行时间