性能
UNIX系统的程序运行时间
用户CPU时间:运行代码需要的时间
系统CPU时间:为运行用户代码而运行其他代码所用的时间
运行时间:墙钟时间(几点几分几秒)
运行时间=用户CPU时间+系统CPU时间+其他时间
最佳选择:在没有其他负载的系统上多次测量实际完成工作负载的墙钟时间。
(延迟=结束时间-开始时间)
(吞吐=给定时间内完成的任务量)
但是:
(吞吐!=1/延迟)(如果存在并行)
优化性能时,必须要考虑其他的指标。可以考虑使用复合指标,防止在优化指标的时候忽略另一些指标。
伪性能指标
IPC(每周期执行指令数)
MIPS(每秒百万条指令数)
GHz(每秒周期数)
IPC和MIPS是平均指标,可以通过特定的指令组合得到更好的数值;这些指标可以在牺牲彼此和实际性能的情况下得到改进,所以不具有实际意义。
墙钟时间=时间/周期数周期数/指令数指令数/程序
相对性能
减少“X比Y慢50%”这种说法,因为会导致歧义。
如果(time_x=1.0s),那么(time_y=0.5s(time_y/time_x=0.5)),或者(time_y=0.6666s(time_x/time_y=1.5))。
所以为了避免歧义,我们使用以下的两种描述方式:
-
“X比Y快n倍”:
- (n=吞吐X/吞吐Y)
-
“X比Y快m%”:
- (1+m/100=吞吐X/吞吐Y)
加速比
(speedup=t_{改进前}/t_{改进后})
Amdahl定律
并行化程序的铁律。
假设一段代码中有(f%)的部分可以并行化,那么并行化后的时间为:
[time_{new} = time_{old}*((1-f)+f/n)
]
[speedup = time_{old}/time_{new}=1/((1-f)+f/n)
]
这里(n)表示可用的处理器个数,我们发现,并行程序加速比受限于任务中的串行部分(不可并行化的部分)。
benchmark
标准基准程序,例如SPEC等。
小结
性能是一个十分综合的量度,所以并没有一刀切的方法。
这就要求我们在衡量性能的时候,一定要想好想测量什么,明确知道自己测了什么,确保报告的内容准确且有代表性,准备好原始数据可复现。