常用profile工具

1. profile工具的作用

profile工具一般用于收集程序的运行信息(如函数的调用信息、指令信息等)。利用这些信息,一方面我们能快速了解难以阅读的大型程序的运行流程;另一方面更重要的、也是本文主要要介绍的,是可以让用来分析、找出程序的瓶颈或错误。

2. 常见profile工具收集数据的方法

2.1 采样(sampling)

采样是指在程序运行过程中按一定的间隔(例如几个CPU时钟)去收集程序的运行信息(例如采样时的函数调用栈、栈顶函数等),并根据这些信息来计算出各种profile指标(如函数的调用次数,占总执行时间的百分比等)的近似值。VS2005、OProfile和gprof提供这种方法。

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

2.3 两种方法的比较

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

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

3. profile前的准备工作

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

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

4. 用profile工具收集信息

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

5. profile结果查看与分析

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

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

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

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

  • 1) Exclusive Percent:这一项指标表示函数单独占用的运行时间,可以让我们找出程序中被调用最多的、占用时间最长的函数。
  • 2) Inclusive Percent:这一项指标表示函数及其调用的子函数所占用的总的运行时间,可以通过它来了解程序中占用时间最长的处理流程。
  • 3) 查看函数调用信息可以更好的了解一个流程的过程和流程中每个函数的细节。
  • 4) 与源码关联可以更加直观,并且可以配合cache命中率找出分支预测错误等问题以便改进代码。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容