程序性能包括两个部分:空间效率和时间效率
1、程序性能
1.1 空间效率
一个运行的程序所占用的内存
1、栈,函数调用时操作系统自动分配的内存
函数调用层次越深,栈需要的内存也就越多,典型的形式的函数递归
总结:程序栈设计考虑
递归函数评估可能存在的最大的递归深度,从而计算需要的栈内存上限
非递归函数评估最大的调用深度,从而计算栈内存上限
2、堆,用户申请的动态内存
用户使用类似malloc函数或者brk函数等动态内存
总结:程序堆设计考虑
根据具体的应用场合评估动态内存分配的次数与最大分配量
3、程序镜像 ,可执行程序占用内存空间
- 4、运行时内存统计技巧
1.2 时间效率
程序时间包括两个方面:编译时间和运行时间
-
编译时间
源代码编译生成可执行文件的时间;
编译时间只会影响开发效率,一般来讲大型工程编译时间可能相当漫长。一般时间效率评估可以不计算编译时间 -
运行时间
评估某一个具体的执行单元需要的时间,比如一个函数:可以使用两种方式评估
其一,比较操作计数:t = n1*(加法操作) + n2(乘法操作)+n3(比较操作)…
其二,比较某个程序片段执行次数
1.3 f(n) 程序性能表示
f (n) 表示一个程序的时间或空间复杂性,它是实例特征n的函数
-
大写O符号:大写O 符号给出了函数f的一个上限
[线性函数]
对于函数f (n) = 3n+ 3,当n≥3时,有3n+ 3≤3n+n= 4n,所以f (n)= O (n)
[平方函数]
定f (n) = 10n2 + 4n + 2 。对于n≥n0 = 5,f (n) ≤1 0n2 + n2 = 11n2 ,所以f (n)= O (n2 )。
[指数函数]
考察一个具有指数复杂性的例子f (n)= 6 * 2n + n2 。对于n≥4,有f (n)≤ 6 * 2n + 2n = 7 * 2 n ,因此6 * 2n+ n2 = O (2^n )
[常数函数]
当f (n)是一个常数时,比如f (n) = 9或f (n) = 2 0 3 3,可以记为f (n)=O (1) -
Ω符号
Ω符号与大O 符号类似,它用来估算函数f 的下限值。同O符号相近[线性函数]
对于函数f (n) = 3n+ 3,对于所有的n,有f (n) = 3n+ 2 > 3n,因此f (n) = Ω(n)。[平方函数]
对于所有的n≥0,有f (n) = 10n2 + 4n+ 2 > 1 0n2,因此f (n)=Ω (n2 )。[指数函数]
f(n)=6 * 2^n +n2 > 6 * 2^n … Ω ( 2^n )。
一般来讲,时间复杂度围绕上限以及下限分析即可!
举例: