论坛首页 编程语言技术论坛

读 代码优化 的总结

浏览 2603 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-30  
C++
系列文章见
http://blog.csdn.net/housisong<wbr></wbr>/


= 读代码优化-之-Base64编码函数 的总结 =

常用技巧

1.查表替代计算,更大的表
说明:表太大可能不能装入CPU的一级缓存,所以函数运行可能会更慢(常用值8K)
实例:
那么对于这样的代码: output[0]=to_base64char(input[0]>>2);
可以化简为: output[0]=BASE64_CODE[input[0]>>2];

前面的代码中6bit的数据查表可以得到8bit的输出数
那么可以构造一个更大的表,一次使用12bit的数据查表得到16bit的输出数据!

2.多核优化
说明:效果比较明显
实例:
Base64编码函数其实很容易实现并行算法,把数据切割成几段让多个CPU执行就可以了;
速度对比
// base64_encode1_asm   1258
// base64_encode2        702

汇编/平台相关技巧

1.在当前的32比特CPU上一次写入4字节将获得更好的性能;而输入数据的地方,可以先转化成32比特整形数据再做各种复杂的位运算有利于编译器的优化(各个PC平台的差异可能比较大);

2.想法是尽量压缩寄存器的使用,然后多个寄存器就能同时执行多路,增加了指令的并发能力;

3.使用sse和sse2的写缓存优化
说明: 优化写缓冲需要满足的条件是写入的数据量比较大或者需要写入的数据不需要很快就访问,
从而避免了写入的数据被CPU自动缓冲而"污染"缓存;(如果条件不满足,“优化”反而会变成劣化)

= 读代码优化-之-优化条件分支  的总结 =

1.尽量简化循环中分支条件,提高预测的命中率
比如:
一些图像处理算法里(比如模板运算\卷积运算\形态学运算等),经常需要判断边
界像素点,进行特殊处理;可以考略的优化方案是把边界区域和内部区域分开处理;

2.将出现几率高的分支优先处理,从而提高预测准确率

3.合并多个条件来减少条件分支
 如: if ( (a0==0) && (a1==0) && (a2==0) ) ...
 可以改写为: if ( (a0|a1|a2)==0 ) ...

4.一些比较hack的写法,主要是利用位运算来取消分支
针对不同类的数据生成不同的掩码数据,然后让原数据和掩码参与运算得到想要的结果,从而移除分支;
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics