
1.4 一个程序性能分析的实例
在软件优化的过程中,需要对软件性能进行详尽的测试与分析,并从中找到影响性能的关键性因素,良好的实验和性能分析报告对于性能分析具有重要作用。
实验报告一般包括问题描述、实验方法和实验结果分析等部分。问题描述主要介绍问题的背景以及软件测试的目标,并介绍实验相关的硬件、操作系统、编译器等信息。实验方法讨论实验的具体输入、输出参数设计和实验过程设计。影响程序执行时间的因素往往有多个方面,为了更清晰地分析不同因素对程序性能的影响,经常会保持其他因素不变,而仅变化一个因素,从而考察此因素设置为不同参数时对性能的影响。实验结果分析是对比不同输入/输出参数和不同软件实现方案时的性能,并从中发现影响性能的关键性因素。
本节将以对C语言中qsort()函数性能的测试与分析说明实验报告的书写规范。
【实验报告范例】
问题描述
qsort()函数是C语言中常见的排序函数。本实验将分析数据规模、数据类型、输入数据排列三个方面对该函数执行时间的影响,实验所使用的软硬件平台参数如表1-6所示。
表1-6 实验用软硬件平台参数

实验方法
为了测试数据规模、数据类型、输入数据排列三个方面对qsort()函数的性能影响,在数据规模方面,设定1M、10M、100M三种不同的元素数量;在数据类型方面,使用32位整数、64位整数和32位单精度浮点数三种不同的类型;在输入数据排列方面,考虑完全随机、倒序和近似顺序三种情况。
(1)完全随机:每个元素都由随机数产生函数rand()产生。
(2)倒序:在完全随机测试案例基础上使用qsort()进行从大到小的降序排列得到的数据序列。
(3)近似顺序:在完全随机测试案例基础上使用qsort()进行从小到大的升序排列,然后从中挑选千分之一的相邻数据交换得到的数据序列。
实验结果分析
上述三方面的参数各自有三种可能性,相互组合可以得到27种不同的测试案例。这些案例中qsort()函数升序排序时间如表1-7所示。
表1-7 排序的性能评测(单位:ms)

实验结果呈现以下特点。
❑在相同数据类型和输入数据排列下,数据规模增至原来的10倍,排序时间一般随之变为11.5倍左右。
❑在相同数据规模和输入数据排列下,数据类型的区别对性能的影响不大。
❑在相同数据规模和数据类型下,输入数据排列对性能影响较大:完全随机的排序时间最长;倒序和近似顺序的时间比较接近,大约为完全随机排序时间的65%左右。
之所以产生上述现象,主要是因为以下原因。
❑qsort()函数采用了快速排序方法,其计算复杂度为O(nlogn)。在n等于1M和10M时,10nlog(10n)/nlogn的值分别为11.6和11.4,这与上述第1个特点完全符合。
❑qsort()函数中,数据类型仅影响其比较过程,对其控制开销和数据搬移开销影响不大,所以数据类型的差异对性能影响不大。
❑qsort()函数内部可能会对不同排列类型的数据进行优化处理,使得对倒序排列和近似顺序排列的数据排序时有较高的性能。