深入理解计算机系统--优化程序性能

第五章 优化程序性能

   编写高效程序需要两类活动:第一,我们选择一组最好的算法和数据结构;第二,我们必须编写出编译器能够有效优化以转换成高效可执行的代码的源代码。

  对于第二个,理解优化编译器的能力和局限性是很重要的。

  事实上,编译器只能执行有限的程序转换,而且妨碍优化的因素(optimization blocker)还会阻碍这种优化,妨碍优化的因素就是程序中那些严重依赖于执行环境的方面。

  代码剖析程序(profilers)

  研究汇编代码是理解编辑器以及产生的代码会如何运行的最有效的手段之一。

 5.1 优化编译器的能力和局限性

     一、存储器别名使用(memory aliasing)

     编译器必须假设不同的指针可能会指向存储器中同一个位置。这造成了一个主要的妨碍化因素,这也可能是严重限制编译器产生优化代码机会的程序的一个方面。 

    二、函数调用

      编译器会假设最糟的情况,并保持所有的函数调用不变。

 5.2 表示程序性能

    CPE (cycles per element)

 5.3 程序示例

 5.4 消除循环的低效率

    代码移动(code motion)

    渐近的低效率

 5.5 减少过程调用

 5.6 消除不必要的存储器引用

 5.7 理解现代处理器

   5.7.1 整体操作

     深入理解计算机系统--优化程序性能_第1张图片

  5.7.2 功能单元的性能

  5.7.3 更近地观察处理器操作

 5.8 降低循环开销

    减少循环展开次数

 5.9 转换到指针代码

 5.10 提高并行性

  5.10.1 循环分割

     二次循环展开并使用二路并行

 5.10.2 寄存器溢出

 5.10.3 对并行的限制 

 5.11  综合:优化合并代码的效果小结

 深入理解计算机系统--优化程序性能_第2张图片

   5.11.1 浮点性能异常

   5.11.2 变换平台

 5.12 分支预测和预测错误惩罚

   指令流水线化

 5.13 理解存储器性能

   5.13.1 加载的执行时间

   5.13.2 存储的执行时间

 5.14 现实生活:性能提高技术

 5.15 确认和消除性瓶颈

          

 

    

   

   

    

 

    

  

   

    

   

  

  

   

   

  

   

     

你可能感兴趣的:(深入理解计算机系统)