如何使用oprofile计算一部分C程序的执行时间?

Posted

技术标签:

【中文标题】如何使用oprofile计算一部分C程序的执行时间?【英文标题】:How to use oprofile to calculate execution time of a part of C program? 【发布时间】:2018-03-01 08:43:09 【问题描述】:

我想使用oprofile 分析一部分 C 代码 (user_defined_function()) 并计算执行它所花费的时间。有关如何执行此操作的任何指示都会非常有帮助。提前致谢!!

#include <stdio.h>
int main()  
  
    //some statements;

    //Begin Profiling  
    user_defined_function();  
    //End Profiling  

    //some statements;
    return 0;  
  

【问题讨论】:

SO 不太适合开放式问题,也不太可能有人会为您编写完整的教程。请缩小您的问题范围,并说明您遇到的问题。 Execution time of C program的可能重复 感谢您的快速回复。对不起,我意识到我最初的问题并不清楚。因此,我可以使用clock() 计算执行时间,但我不确定如何在c 程序中使用oprofile。 oprofile 的官方文档目前不可用。我可以使用 oprofile 来分析整个应用程序,但不能用于部分代码。另外,我不是在找人来为我写一个完整的教程。我想从有使用它的经验的人那里得到一些关于如何使用它的指示。谢谢! 【参考方案1】:

我在http://oprofile.sourceforge.net/doc/index.html 和http://oprofile.sourceforge.net/faq/ 文档中看不到开启/关闭标记。如果要分析的代码足够长,可能使用 --start--stop 调用 (fork+exec) opcontrol 会有所帮助。

使用perf 工具在分析(采样)模式perf record(和/或可能operf,它基于相同的perf_event_open 系统调用),您可以尝试分析完整程序并在@987654337 添加一些标记@ 和 End Profiling 点(通过使用一些自定义跟踪事件),然后您可以使用 perf script 转储整个 perf.data,查找标记的事件并仅剪切标记之间的部分配置文件(perf.data 中的每个事件都有时间戳,它们是有序的,也可以按时间排序)。

通过直接使用perf_event_open 系统调用,您可以使用PERF_EVENT_IOC_ENABLE / PERF_EVENT_IOC_DISABLE 操作对perf 的fd 描述符上的"man 2 perf_event_open" page 中描述的ioctl 调用启用和禁用来自同一进程的分析。手册页还列出了使用 prctl 临时禁用和重新启用程序分析(这甚至可以与 oprofile 一起使用,在 main 开始时禁用,在开始时启用,在结束时禁用)

使用 prctl(2) 进程可以启用或禁用所有事件组 使用 prctl(2) PR_TASK_PERF_EVENTS_ENABLE 和 PR_TASK_PERF_EVENTS_DISABLE 操作。

使用性能计数器的另一种方法不是采样分析,而是计数(perf stat ./your_program / perf stat -d ./your_program 这样做)。此模式不会为您提供“热门”功能列表,它只会说您的代码在 1.3 亿个周期内执行了 1 亿条指令,其中 1000 万次 L1 缓存命中和 500 万次 L1 缓存未命中。有一些包装器可以启用对程序部分的计数,例如:PAPI http://icl.cs.utk.edu/papi/ (PAPI_start_counters), perfmon2 (libpfm3,libpfm4), https://github.com/RRZE-HPC/likwid (pdf, likwid_markerStartRegion), http://halobates.de/jevents.html & http://halobates.de/simple-pmu,等等。

【讨论】:

非常感谢。带有 ioctl 调用的 perf_event_open( ) 正是我想要的! VIPIN,还要检查“prctl(2) PR_TASK_PERF_EVENTS_ENABLE 和 PR_TASK_PERF_EVENTS_DISABLE 操作”——它们可以与 perf 和 operf/oprofile 等外部工具一起使用。

以上是关于如何使用oprofile计算一部分C程序的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

Linux性能调优之gprof和oprofile

安卓上的OProfile

使用 perf_events/oprofile 在 Linux 上分析 JIT 的输出?

在虚拟机中运行的 Linux 上的 oprofile

如何使用oprofile对软件做profiling

测量选定循环的执行时间