读书人

惯用profile工具使用-采样和检测

发布时间: 2012-09-04 14:19:30 作者: rapoo

常用profile工具使用--采样和检测



1.2.2 检测(instrumentation)

检测方法通过在函数的入口和出口处插入探测点来的方法来收集程序执行时的各种统计信息。按插入探测点的方法可以将检测分为几种:

1) 手工方法(Manual):在编写代码时在关键位置加入统计或输出信息的代码。

2) 自动源码修改工具(Automatic source level):和上面一样,手工方法修改工作量比较大时使用脚本完成1的功能。

3) 使用编译器加入(Compiler assisted):在编译链接过程中插入,例如gprof

4) 修改二进制文件(Binary translation):在二进制文件中插入,例如ATOM

5) 运行时动态检测(Runtime instrumentation):程序运行时会被检测工具完全控制并统计,例如Valgrind

6) 运行时注入(Runtime injection):可以看作轻量级的动态检测,程序运行时被置入监测点,例如Dynlnst

下图是检测方法的原理图:

惯用profile工具使用-采样和检测

1.2.3 两种方法的比较

采样方法占用资源较少,几乎不会影响程序的运行,生成的统计信息文件也小。但是获得的并不是完全准确的信息。

检测方法占用资源较多(程序可能会慢上几十倍),可以获得程序执行的准确信息,如能提供诸如cache命中率,内存使用等更多信息。

1.3 profile前的准备工作

使用采样方法一般不需要对程序进行特别处理,如指定特殊的编译选项等。而检测方法则可能需要加入特殊选项(比如VS2005的profile工具);也可能不需要特殊选项(比如Valgrind,因为它是动态检测的(超级慢))。有些工具建议使用带调试信息的选项比如gcc的-g用来将分析与源码关联。

如果需要特殊选项来编译程序,会在介绍工具的简介中说明。

1.4 用profile工具收集信息

有两种方法可以使profile工具与你要分析的程序相关联,加载(launching)和附加(attaching)。加载方法是使用profile工具来启动你要分析的程序,程序在启动时已经被profile工具监控。附加允许profile工具与一个已经运行的程序相关联,一般只有采样方法才能使用,因为检测方法不能对没有插入探测点的程序进行分析。

1.5 profile结果查看与分析

profile的结果通常既可以使用文本方式查看,又可以使用图形界面(GUI)工具查看。本文介绍的profile工具都有用于查看结果的配套界面工具,推荐使用。

从profile的对象的级别上看,profile的结果分为函数级的信息(如每个函数的调用次数、执行时间;函数之间的调用情况)和指令级的信息(如每条命令的指令数、cache命中情况);其中大多数profile工具的分析报告中都包含前者,但只有部分工具提供后者。

从形式上看,profile的分析报告又可以分为三类:单个函数的统计信息;函数之间的调用信息;与源代码关联的信息(参见valgrind部分的示例)。

以下是我们对profile的结果进行分析时经常用到的信息:

1) Exclusive Percent:这一项指标表示函数单独占用的运行时间,可以让我们找出程序中被调用最多的、占用时间最长的函数。

2) Inclusive Percent:这一项指标表示函数及其调用的子函数所占用的总的运行时间,可以通过它来了解程序中占用时间最长的处理流程。

3) 查看函数调用信息可以更好的了解一个流程的过程和流程中每个函数的细节。

4) 与源码关联可以更加直观,并且可以配合cache命中率找出分支预测错误等问题以便改进代码。

读书人网 >其他相关

热点推荐