程序优化随笔
前言
过早优化是万恶之源
文本只是提供一些优化可能性
本文目前还只是个草稿雏形,待后续补充
局部性原理
现代程序优化很大一部分都基于局部性原理来进行,这主要是由于存储器和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指令,可以提高寄存器利用,通过并行的方式提高效率