全部博文(436)
分类: LINUX
2012-11-25 22:06:41
2012/11/25 学习报告 1
这周我只看了一本书------《深入理解计算机系统》,通过看目录,我重点关注了5.1、5.4~5.6、5.8、5.10、5.11、5.15这几个小节,这几个小节都是讲方法的。这本书讲解的方法很好,容易理解,这让我收获不少。
收获:
1代码优化的限制因素:编译器优化代码的能力受到不能改变正确的编译行为、对使用代码的环境了解有限,编译速度要求高的限制,下文还提到存储器的别名使用(其实也是包含在对使用代码的环境了解有限中的)是阻碍优化的主要因素。另外还有函数调用。
2.程序性能的衡量:CPE(每元素的周期数)
3. 消除循环的低效率---利用代码移动:将循环过程中计算结果不会改变的部分放到循环之前执行,这样做的好处是能够减少循环调用次数,缺点是编译器无法预知被改变的代码将在哪里被调用和调用多少次的变换,所以编译器不能可靠地知道一个程序的副作用,只能有程序员显示的帮助完成代码移动(应该就是说在写代码的时候就注意到这个问题并将代码写在循环开始前)。
4.减少过程调用:
在这个部分我首先对过程调用进行了理解。在我查找资料后,我是这样理解过程调用的---过程调用用于ILE程序(由多种语言编写的,一个程序可以有多段代码,而其他opm程序只能由一种语言编写,一个程序对应一段代码)的调用。之所以叫做过程调用就是因为对于ILE这样的程序,一个程序下有多段代码,好比如一个事情可以分成好几个步骤完成一样,过程调用就是在这几个步骤之间实现调用。
之所以要减少过程调用是因为过程调用要浪费很多的cpu资源,占用较大的开销,妨碍编译器进行代码优化。减少过程调用可以提高代码运行速度,但是会损害一些程序的模块性,就好像一件事情的完成步骤不完整了一样。
5.消除不必要的存储器引用:在很多循环中,每次循环都要存储一个值,这时候就需要引用存储器,但是其实我们只需要得到循环最后的那个计算结果,因此我们可以通过引用一个临时变量来代替每次循环要更新的数值,最后再将临时变量存入存储器即可,这样就只需一次对存储器进行引用。
6降低循环开销:循环的开销包括计算循环索引和测试循环条件。这篇文章中提到了可以通过循环展开的方式降低循环开销,即在每次循环操作中执行更多的操作来减少循环开销的影响。可是,如果当向量长度不能被展开整除时,需要另外单独完成剩下的元素,也是很麻烦的。其次,这样也增加了更多中间变量和目标代码的数目。
7.提高并行性:顾名思义,提高并行性就能减少cpu执行时间。文中提到用循环分割的方式进行处理来提高并行性。
8.小结:文中最后给出了优化的基本方法,是对前面的一个升华。也让我进一步理解了哪些优化是低层次的哪些是高级设计。
下一步:
1. 转换到指针代码:这部分内容只给出了一段代码示例,但是我看的不是很明白,上网搜索也没找到合适的解释。有待讨论!
2. 我想自己找一些小程序,运用这些方法,尝试着去优化一段代码。
3. 除了介绍的以外,有没有其他的优化方法呢?
4. 代码优化的时候肯定会遇到鱼与熊掌不可兼得的时候,那么我们该如何抉择呢?根据什么抉择?