存档

文章标签 ‘cache’

代码优化(1)

2014年3月20日 没有评论

代码优化,其实是有很多很基本的准则的,这里,不提算法层面的优化,因为这个层面的优化,没有太多好说的,一个好的算法,比各种各样的优化来得都更加靠谱
不多扯,看下面的基本规则
1. 延迟计算
2. 减少函数调用次数
3. 核心代码尽量短小
4. 合并IO读写
5. 控制数据结果大小,一般情况下是缩小(在已经考虑内存对齐的情况下)
6. 减少浮点运算,在精度允许的情况下,采用整数运算(放大再运算,保证精度范围)
7. 控制锁粒度、

其实写了那么多,归纳下来,就是那么几个点
1. 尽量保证cache的命中率(核心数据结构,核心代码足够短小,核心逻辑的代码尽量靠近,不要有长距离的跳转)
3. 减少浮点运算,尽量用整数运算(cpu的浮点运算和整数运算能力差异太大了)
4. IO合并

然后,具体到代码层面,大概可以看到这些特点
1. 延迟构造对象,对象要用的时候,再构造,所以,能压缩声明周期就压缩生命周期
特别是对于c++这种代码
甚至可以考虑
{
type obj;
} // 手工加上限制的作用域
2. 减少数据结构的大小
当数据结构太大的时候,超过一个cache line长度的时候,就需要考虑了,因为,压缩一次,cpu的读取就可能要少多次。一般的做法是,对成员进行重排,防止对齐的padding,然后是,合理的压缩字段的长度,比如,一个标志位,8个标志够了,就不用给int了,一个char就够了,甚至可以考虑位域。
3. 核心代码的逻辑要紧凑,不要散落得哪里都是
很多人写代码,写到哪里是哪里,结果,一条主线逻辑,几乎贯穿了整个代码,中间到处是各种异常逻辑,然后各种跨库的调用,这些东西都是很影响性能的。因为,非主线逻辑,很多时候,不会执行,这是给编译器的优化增加难度。所以,能把核心逻辑提炼出来,最好还是提炼出来,同理,经常调用的代码,最好写在一起,同一个文件,这样编译出来,物理位置也靠近。
算了,不写了,下次接着继续