本章介绍了多种程序性能的度量指标,以及Windows,Linux系统下的度量方法。
执行时间
1.局部程序
C语言中可以利用time,clock等函数来查看局部程序的消耗时间
2.整体程序
Linux下可以使用time命令来查看程序消耗的时间
>>/home/Code# time ./hello.out
real 0m0.002s
user 0m0.002s
sys 0m0.000s
Windows环境下可以在PowerShell中使用命令Measure-Command { .\your_program.exe }来查看
>Measure-Command {.\Example.exe}
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 81
Ticks : 810832
TotalDays : 9.38462962962963E-07
TotalHours : 2.25231111111111E-05
TotalMinutes : 0.00135138666666667
TotalSeconds : 0.0810832
TotalMilliseconds : 81.0832
计算与访问内存效率
计算效率指的是硬件(CPU、GPU)的实测浮点性能与理论浮点峰值性能之比,访存效率指的是硬件的有效访存带宽与带宽上限之比,有效访存带宽是指程序访存的数据量与计算时间的比值。
不同的程序对计算效率和访存效率的要求不同,并以此可以分为计算密集型程序和访存密集型程序。所以,要抓住程序的主要矛盾进行优化。
Windows和Linux环境下均有大量的工具能够查看这两个效率,在此不赘述。
吞吐量与延迟
当考虑一个交互式的程序或者说一个软件系统的性能时,会考虑吞吐量与延迟这两个指标。它们分别对该程序的整体和局部进行评判。
吞吐量指的是给定时间内,能够完成的工作量,任务数。吞吐量越大程序的效率越高。延迟指的是完成单个任务所占的时间。延迟越小响应的速度也就越快。让吞吐量变大,让延迟减小是系统优化的两个方向。
加速比
这个定义比较朴素,加速比等于优化前程序执行时间/优化后程序执行时间。必须说明的是,实际加速比往往小于理论加速比,因为存在多种潜在的开销。但如果使用并行的方式优化程序后,加速比大于并行个数(称为超线性加速),说明优化前的串行程序并没有很好地发挥单处理器的性能,本身就具有很大优化空间。
关于加速比,有两个很朴素的定律
Amdahl定律:S = 1/( (1-a) +a/n ),其中S表示程序优化的加速比,a表示程序中可以并行处理的部分,n表示并行的核数。这仅在任务总量恒定,且并行不存在通信等问题时成立。
Gustafson定律:S = (1-a) + an,其中S表示扩展加速比,a表示程序中并行处理的部分,n表示并行的核数。串行的部分越小核数越大,则扩展加速比越大。
提升上述指标的方法论,请见专栏的下一篇文章《三、程序优化的和流程》
专栏安排(已有,或将有)
一、程序性能优化的意义
五、程序编写时的优化(上):算法优化、数据结构优化、函数优化
七、编译与运行时的优化(上):编译器结构、编译选项、编译优化
七、编译与运行时的优化(下):数学库优化、运行时的优化
八、系统配置的优化
九、单核优化
十、OpenMP程序优化
十一、MPI程序优化
十二、…
如有不足之处,敬请批评指正
更欢迎在评论区留下你的见解,你的方法,如果有效我会增加在文章中,并@你。