我想测量在 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, 所以你不能在时差上中继。您有两种选择
-
使用英特尔 V-Tune 和英特尔检查器等分析软件,这些软件将利用硬件性能计数器
使用实时linux内核,使用FIFO调度程序调度进程并使用时差,在 FIFO调度器中没有人中断您的程序,因此您可以安全地使用时差作为在函数中花费的时间,使用clock((,gettimeofday((甚至更精确的rdtsc