如何使用oprofile计算一部分C程序的执行时间?
How to use oprofile to calculate execution time of a part of C program?
我想使用 oprofile 分析一部分 C 代码 (user_defined_function()) 并计算执行它所花费的时间。关于如何执行此操作的任何指示都会非常有帮助。提前致谢!!
#include <stdio.h>
int main()
{
//some statements;
//Begin Profiling
user_defined_function();
//End Profiling
//some statements;
return 0;
}
我在 http://oprofile.sourceforge.net/doc/index.html and http://oprofile.sourceforge.net/faq/ 文档中没有看到打开/关闭标记。如果要分析的代码足够长,使用 --start
和 --stop
调用 (fork+exec) opcontrol
可能会有所帮助。
在分析(采样)模式下使用 perf
工具 perf record
(and/or 可能 operf
基于相同的 perf_event_open
系统调用)你可以尝试分析完整程序并在 Begin Profiling
和 End Profiling
点添加一些标记(通过使用一些自定义跟踪事件),然后您可以使用 perf script
转储整个 perf.data
,查找事件您的标记并仅剪切标记之间的部分配置文件(perf.data 中的每个事件都有时间戳,并且它们已排序或可以按时间排序)。
通过直接使用 perf_event_open
系统调用,您可以使用 "man 2 perf_event_open" page 在 perf 的 fd 描述符上使用 PERF_EVENT_IOC_ENABLE
/ [ 描述的 ioctl 调用从同一进程启用和禁用分析=23=]动作。手册页还列出了使用 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
就是这样做的)。此模式不会为您提供 'hot' 函数列表,它只会说您的代码在 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,等等。
我想使用 oprofile 分析一部分 C 代码 (user_defined_function()) 并计算执行它所花费的时间。关于如何执行此操作的任何指示都会非常有帮助。提前致谢!!
#include <stdio.h>
int main()
{
//some statements;
//Begin Profiling
user_defined_function();
//End Profiling
//some statements;
return 0;
}
我在 http://oprofile.sourceforge.net/doc/index.html and http://oprofile.sourceforge.net/faq/ 文档中没有看到打开/关闭标记。如果要分析的代码足够长,使用 --start
和 --stop
调用 (fork+exec) opcontrol
可能会有所帮助。
在分析(采样)模式下使用 perf
工具 perf record
(and/or 可能 operf
基于相同的 perf_event_open
系统调用)你可以尝试分析完整程序并在 Begin Profiling
和 End Profiling
点添加一些标记(通过使用一些自定义跟踪事件),然后您可以使用 perf script
转储整个 perf.data
,查找事件您的标记并仅剪切标记之间的部分配置文件(perf.data 中的每个事件都有时间戳,并且它们已排序或可以按时间排序)。
通过直接使用 perf_event_open
系统调用,您可以使用 "man 2 perf_event_open" page 在 perf 的 fd 描述符上使用 PERF_EVENT_IOC_ENABLE
/ [ 描述的 ioctl 调用从同一进程启用和禁用分析=23=]动作。手册页还列出了使用 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
就是这样做的)。此模式不会为您提供 'hot' 函数列表,它只会说您的代码在 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,等等。