不合标准的应用程序性能会产生软件或网络问题。为确保软件满足或超过设计的期望值,有必要分析应用程序的性能以发现潜在的问题。这个过程被称为“性能分析”。它包括检查应用程序以确保每个组件有效地工作,并根据设计密切注视处理器的使用、网络和
系统服务、存储和输入/输出(I/O)。
历史
早在1970年代,IBM System/360及IBM System/370的平台就有性能分析工具,一般是用计时器中断在固定的时间纪录
程序状态字(PSW)来侦测程序运行时的“过热点”(hot spots)。这是早期使用
抽样方式进行性能分析的示例之一。在1974年时,指令集仿真器就允许完整的事件踪迹,以及其他性能监控的机能。
以性能分析工具为主的UNIX程序分析至少可以回溯到1979年,当时Unix系统有一个基础工具prof,可以列出每一个函数,也列出此函数总共花了多少时间。1982年时
gprof工具延伸此概念,可以列出完整的函数调用图。
1994年时,迪吉多的Amitabh Srivastava和Alan Eustace提出了描述ATOM的论文。ATOM是一个平台,可以将程序配合其性能分析工具调整,在编译期间,ATOM会在要分析的程序中加入代码,而加入的代码会输出分析数据,这种修改程序,输出自身份析数据的技术,称为逻辑注入。
2004年时.gprof和ATOM论文都出现在前50个最具影响力的编程语言设计和实现会议(PLDI)论文中。
诊断问题
性能分析的一个必不可少的环节是使应用程序的组件可见。当能够了解组件是如何交互时,就可以诊断潜在的性能问题。传统上,了解
分布式应用程序中组件间的交互一直很困难。而VisualStudioAnalyzer提供了不同的方法来了解交互情况,从而解决了此问题。例如,可在进程间或这些交互的持续时间内了解交互情况。当能够深入了解应用程序并发现出现问题的原因时,就可以:
●确保应用程序的行为按设计如期进行。
●通过详细报告应用程序和网络响应以及传递的时间,显示应用程序在哪些方面导致大量的处理开销、文件争用或磁盘或网络访问过度延迟。
●收集全面的分析数据并将其结合用于应用程序进程的端对端视图和数据涉及的所有设备。
输出方式分类
一般性能分析器
一般性能分析器(flat profiler)根据函数调用计算平均的函数调用次数,而且不会根据被调用函数或是运行脉络(context)细分函数调用次数。
函数调用图性能分析器
函数调用图会显示函数被调用的次数及频率,也会列出函数调用链(call-chains),有些软件会列完整的调用链,有些不会。
分析方式分类
性能分析器本身也是程序,可以在被分析程序运行时收集相关信息,来分析该程序。根据收集到信息的细微度,以及收集信息的方式,可以分为事件为基础的性能分析器,或是统计式的性能分析器。有些性能分析器为了收集信息,会中断程序的运行,因此在时间量测上有一定的分辨率限制。
事件为基础的性能分析器
以下列出的编程语言有事件为基础的性能分析器:
统计式的性能分析器
有些性能分析器是用取様的方式运作。取様式的性能分析器利用
操作系统的
中断,在固定时间取様目的程序的
程序计数器。取様式的性能分析器在数值上较不精准,但对目的程序运行时间的影响最小,允许目的程序可以在接近全速的速度下运作。
所得到的数据不是精准值,只是统计上的近似值而已。“实际误差的量一般会大于一个取样时间.若芋某一数值是取様时间的n倍,其误差约为n倍取様时间的平方根”
在实务上统计式的性能分析器会比其他的分析方式更能知道目的程序各部分占的比例,而且相较之下有较少的
边际效应(例如存储器缓存或是指令解码的管道线等),由于统计式的性能分析器对程序运行速度的影响较小.因此可以侦测到一些其他方式侦测不到的问题。这种方式可以看出用户模式及可中断系统模式(例如
系统调用)分别占的时间。
不过由于系统程序需处理中断,仍然会花一些CPU的运行周期,分散缓存的读取,而且无法分辨在不可中断核心模式下的行为。
有些特制的硬件可以克服这类的问题:有些最近MIPS微理器中,
JTAG接口有一个PCSAMPLE寄存器,可以用一种无法侦测到的方式来取様程序计数器。
最常用的统计式的性能分析器包括
AMD的CodeAnalyst、
苹果公司的Shark(OSX)、
Intel的
VTune及Parallel Amplifier(Intel Parallel Studio的一部分)。
插装型的性能分析器
有些性能分析可以用插装(也称为逻辑注入)的方式处理目的程序,也就是在目的程序中加入额外指令来收集需要的信息。
程序的插装会影响程序的性能,可能会出现不精确的结果及heisenbug(捉摸不定,不易重现的
bug)。插装一定会对程序运行有些影响,常见的情形是使程序变慢。不过插装可以特定只针对部分程序,而且可以小心控制以使影响降到最低。其对于特定程序的影响是看插装放置的位置,以及捕捉踪迹(trace)的机制。有些处理器有硬件支持可以捕捉踪迹,插装可以只占一个
机器语言周期的时间。一般可以从结果中移除插装的影响。
gprof是一个同时用插装及取様的性能分析器的例子。插装用来获取被调用函数的信息,而实际花的时间则是由取様方式来获得。
插装是决定性能分析器可控制程度及时间分辨率的关键。以下是一些方式的分类。
解释器式的插装
hypervisor或仿真器