性能分析

✍ dations ◷ 2025-07-22 22:09:48 #软件工程,计算机科学

在软件工程中,性能分析(performance analysis也称为profiling),是以收集程序运行时信息为手段研究程序行为的分析方法,是一种动态程序分析(英语:Dynamic program analysis)的方法。

性能分析量测像是程序的空间或时间复杂度、特定指令的使用情形(英语:instruction set simulator)、函数调用的频率及运行时间等。性能分析的目的在于决定程序的哪个部分应该被优化(英语:Program optimization),从而提高程序的速度或者内存使用效率。

性能分析可以由程序的源代码或是可执行档进行。一般会使用称为性能分析工具(profiler)的工具进行。性能分析工具会使用许多不同的技术,可能是以事件为基础(Event-based)的、统计的、指令导向的、仿真的方法。性能分析工具常用在性能工程(英语:Performance engineering)的过程中使用。

"若要了解程序行为,程序分析工具非常重要。计算机体系结构分析师需要这类工具来评估程序在新的系统结构中运作的情形。软件撰写者需要这类工具来分析程序,并分析出其中关键的区块。编译器撰写者需要这类工具来评估其指令调度或分支预测算法运作的情形"

性能分析工具使用广泛的技术手段收集数据,包括硬件中断、代码指令(英语:Instrumentation (computer programming))、作业系统hooking(英语:hooking)、CPU内置的性能计数寄存器(英语:Hardware performance counter),等等。

性能分析输出会是:

/* ------------ 源代碼------------------------- 發行次數 */            0001             IF X = "A"                     00550002                THEN DO                      0003                  ADD 1 to XCOUNT           00320004                ELSE0005             IF X = "B"                     0055


早在1970年代,IBM System/360及IBM System/370(英语:IBM/370)的平台就有性能分析工具,一般是用计时器中断在固定的时间纪录程序状态字(英语:Program status word)(PSW)来侦测程序运行时的“过热点”(hot spots)。这是早期使用抽样方式进行性能分析的示例之一。在1974年时,指令集仿真器(英语:instruction set simulator)就允许完整的事件踪迹,以及其他性能监控的机能。

以性能分析工具为主的UNIX程序分析至少可以回溯到1979年,当时Unix系统有一个基础工具prof,可以列出每一个函数,也列出此函数总共花了多少时间。1982年时gprof工具延伸此概念,可以列出完整的函数调用图(英语:Call graph)。

1994年时,迪吉多的Amitabh Srivastava和Alan Eustace提出了描述ATOM的论文。ATOM是一个平台,可以将程序配合其性能分析工具调整,在编译期间,ATOM会在要分析的程序中加入代码,而加入的代码会输出分析数据,这种修改程序,输出自身份析数据的技术,称为逻辑注入(英语:Instrumentation (computer programming))。

2004年时,gprof和ATOM论文都出现在前50个最具影响力的编程语言设计和实现会议(英语:Conference on Programming Language Design and Implementation)(PLDI)论文中。

一般性能分析器(flat profiler)根据函数调用计算平均的函数调用次数,而且不会根据被调用函数或是运行脉络(context)细分函数调用次数。

函数调用图(英语:Call graph)会显示函数被调用的次数及频率,也会列出函数调用链(call-chains),有些软件会列完整的调用链,有些不会。

性能分析器本身也是程序,可以在被分析程序运行时收集相关信息,来分析该程序。根据收集到信息的细微度,以及收集信息的方式,可以分为事件为基础的性能分析器,或是统计式的性能分析器。有些性能分析器为了收集信息,会中断程序的运行,因此在时间量测上有一定的分辨率限制。

以下列出的编程语言有事件为基础的性能分析器:

有些性能分析器是用取样的方式运作。取様式的性能分析器利用操作系统的中断,在固定时间取様目的程序的程序计数器。取様式的性能分析器在数值上较不精准,但对目的程序运行时间的影响最小,允许目的程序可以在接近全速的速度下运作。

所得到的数据不是精准值,只是统计上的近似值而已。“实际误差的量一般会大于一个取样时间。若某一数值是取様时间的n倍,其误差约为n倍取样时间的平方根。”

在实务上统计式的性能分析器会比其他的分析方式更能知道目的程序各部分占的比例,而且相较之下有较少的边际效应(例如存储器缓存或是指令解码的管道线等),由于统计式的性能分析器对程序运行速度的影响较小。因此可以侦测到一些其他方式侦测不到的问题。这种方式可以看出用户模式及可中断系统模式(例如系统调用)分别占的时间。

不过由于系统程序需处理中断,仍然会花一些CPU的运行周期,分散缓存的读取,而且无法分辨在不可中断核心模式下的行为。

有些特制的硬件可以克服这类的问题:有些最近MIPS微理器中,JTAG接口有一个PCSAMPLE寄存器,可以用一种无法侦测到的方式来取様程序计数器。

最常用的统计式的性能分析器包括AMD的CodeAnalyst、苹果公司的Shark(OSX)、oprofile(Linux)、Intel的VTune(英语:VTune)及Parallel Amplifier(Intel Parallel Studio(英语:Intel Parallel Studio)的一部分)。

有些性能分析可以用插装(英语:instrumenting)(也称为逻辑注入)的方式处理目的程序,也就是在目的程序中加入额外指令来收集需要的信息。

程序的插装会影响程序的性能,可能会出现不精确的结果及 heisenbug(捉摸不定,不易重现的bug)。插装一定会对程序运行有些影响,常见的情形是使程序变慢。不过插装可以特定只针对部分程序,而且可以小心控制以使影响降到最低。其对于特定程序的影响是看插装放置的位置,以及捕捉踪迹(trace)的机制。有些处理器有硬件支持可以捕捉踪迹,插装可以只占一个机器语言周期的时间。一般可以从结果中移除插装的影响。

gprof是一个同时用插装及取様的性能分析器的例子。插装用来获取被调用函数的信息,而实际花的时间则是由取様方式来获得。

插装是决定性能分析器可控制程度及时间分辨率的关键。以下是一些方式的分类。

相关

  • 科尔萨科夫氏症候群科尔萨科夫氏症候群(Korsakoff's syndrome),又称健忘综合征,为一种大脑缺乏硫胺(维生素B1)而引起的精神障碍。其疾病由俄国神经学家谢尔盖·科尔萨科夫最先发现而命名。科尔萨科夫
  • 布莱克史密斯研究所布莱克史密斯研究所(Blacksmith Institute)是一个资助与环境污染相关研究的非政府机构,成立于1999年,总部设于美国纽约市,2002年起在中国运作。受资助的其中一个研究计划是“受污
  • 希腊神话希腊神话(希腊语:ἡ Ἑλληνικὴ Μυθολογία),是原本语出古希腊人的一系列神话故事。这些神话讲述了宇宙的由来和本质,涉及各色神明、英雄及神秘生物,还谈及希腊人自
  • O157大肠杆菌O157:H7型(Escherichia coli O157:H7)是一种肠道出血性大肠杆菌,是食物中毒的原因之一。感染者通常发生出血性腹泻,尤其在年轻儿童和年长者中,有时导致肾衰竭。传染通过
  • 阵雨骤雨,又称阵雨,相较于持续整日甚至更久的雨,指的是为时不长的降雨,其强度变化可以很大。骤雨多数由积雨云产生。由于积雨云覆盖的面积不大,积雨云一旦移开后,雨就会停止。骤雨一般
  • 氨基甲酸铵442 mbar(45°C)氨基甲酸铵是一种白色的晶体,分子式为 NH2COONH4,在35°C开始分解,并会在59°C时完全分解成氨气和二氧化碳。 氨基甲酸铵是化学工业上尿素生产过程的生成物,加热
  • 甘尼森甘尼森国家森林(英语:Gunnison National Forest)是美国的一座国家森林,面积6,766平方公里,坐落于美国西部科罗拉多州的德尔塔县、甘尼森县、欣斯代尔县、萨沃奇县和蒙特罗斯县五
  • 哈里河哈里河(波斯语:هری‌رود‎,土库曼语:Tejen,Tedzhen),又名捷詹河,从阿富汗中部山区流入土库曼斯坦,消失于卡拉库姆沙漠中,全长约1150公里,流量每秒31立方米,集水面积约7万平方公里
  • 美国法律协会美国法律协会(American Law Institute,缩写为ALI)是一个美国非盈利的民间团体。其主要宗旨在于将法律体系明确化、简化,使法律更能满足社会需要。该协会发表了大量的法律重述(Res
  • 纳坦·瑟德布卢姆拉尔斯·奥洛夫·约纳坦·瑟德布卢姆(瑞典语:Lars Olof Jonathan Söderblom,又称纳坦·瑟德布卢姆,1866年1月15日-1931年7月12日),瑞典牧师,瑞典教会乌普萨拉大主教,1930年因倡导世