- 程序的目标:正确性和性能
- 如何编写高效的程序:
- 选择合适的数据结构和算法。
- 编译器能够有效优化。
- 针对大量运算,并行计算。
- 编译器的局限性:
- 无法判断指针(例如两个指针如果指向同一个地方会出现很多莫名的bug,必须检查指针)。
程序性能的表示:CPE。
例子:
- 1.消除循环的低效率:例如for(int i=0;i<vec.lengh();i++),最好改为:int len = vec.length(); for (int i=0;i<len;i++)。
- 好处是不需要每一次循环都调用函数。(再例如strlen(),性能差距随着循环次数的增加非线性增大)
- 2.消除不必要的存储器引用:
- 3.减少过程调用:但是可能会影响程序的模块性为代价
- 4.在循环中能够使用局部变量,或者减少寻址操作,指针或者全局变量的赋值最好移动到循环外部。以及通过判断等语句减少循环次数。
- 读写相关:存储器读的效果依赖于最近的一次存储器写。
- 小结:性能提高技术:
- 高级设计:为遇到的问题选择和合适的数据结构和算法。
- 基本编码原则:
- 消除连续的函数调用:有妥协性的牺牲模块性
- 消除不必要的存储器引用,引入临时变量保存结果,只有当最后的值计算出来时才放到数组和存储器中
- 展开循环
- 读写相关
- 负载均衡:amdahl定律:想要大幅提高整个系统的速度,必须提高整个系统很大一部分的速度。取决于这个部分有多么重要和速度提高了多少。
- 1.消除循环的低效率:例如for(int i=0;i<vec.lengh();i++),最好改为:int len = vec.length(); for (int i=0;i<len;i++)。
- 好处是不需要每一次循环都调用函数。(再例如strlen(),性能差距随着循环次数的增加非线性增大)
- 2.消除不必要的存储器引用:
- 3.减少过程调用:但是可能会影响程序的模块性为代价
- 4.在循环中能够使用局部变量,或者减少寻址操作,指针或者全局变量的赋值最好移动到循环外部。以及通过判断等语句减少循环次数。
- 读写相关:存储器读的效果依赖于最近的一次存储器写。