程序优化随笔

前言

过早优化是万恶之源
文本只是提供一些优化可能性
本文目前还只是个草稿雏形,待后续补充

局部性原理

现代程序优化很大一部分都基于局部性原理来进行,这主要是由于存储器和CPU本身效率的巨大差距,进而出现的多级缓存机制,不少程序优化就是利用了这一点,尽可能保证高层次的快速缓存能够命中,以此来提升程序的执行效率。

关于编译器优化

虽然现代编译器优化已经可以帮助完成很多常规情况下的优化,但是因为程序执行上的不确定性,有些代码会导致妨碍编译器进行优化,如数组的越界检查、存储器别名使用等情形。

  • 案例 边界检查
    // 检查1次
    func bounds1(s []int, index int) {
      _ = s[index:]
      _ = s[:index]
    }
    // 检查2次
    func bounds2(s []int, index int) {
      _ = s[:index]
      _ = s[index:]
    }
    
  • 案例 存储器别名使用
func addDouble(a, b *int) {
    *a += *b
    *a += *b
}

func addDouble2(a, b *int) {
    *a += 2 * *b
}

这2个函数表面看起来是一样的,但是你考虑一下a和b指针相等情况,就会发现实际上他们并不一致

优化点

缓存行

缓存抖动

利用指令集

如SSE指令,可以提高寄存器利用,通过并行的方式提高效率