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

时间:2018-03-01 08:43:09

标签: c profiling execution-time oprofile

我想使用分析C代码的一部分(user_defined_function())并计算执行它所花费的时间。任何关于如何做到这一点的指示都会非常有帮助。在此先感谢!!

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

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

    //some statements;
    return 0;  
}  

1 个答案:

答案 0 :(得分:0)

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

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

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

使用prctl(2)        进程可以启用或禁用所有事件组        使用prctl(2)PR_TASK_PERF_EVENTS_ENABLE附加到它上面        PR_TASK_PERF_EVENTS_DISABLE操作。

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