1

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

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

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

    //some statements;
    return 0;  
}  
4

1 回答 1

0

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

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

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

使用 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等。

于 2018-03-10T00:07:09.723 回答