关于《深入理解计算机系统》代码加速的思考
2013-08-13 17:21
141 查看
在《深入理解计算机系统》这本书的时候,有一个这样的知识点引起了我的注意:
例如下面这段代码:
代码1:
我们在使用这个循环的时候,如果改用下面的这种形式:
代码2:
也就是在循环中每次处理三个数据,那么时间会大大降低,书中称为“unrolling"技术。
我想每次都用三个变量,同时处理三个数据会有神马效果呢?下面的代码3是我自己的想法
代码3:
下面分别是debug和release版本的时间复杂度对比:
大家首先对比代码1和代码2
在debug模式下,《深入理解计算机系统》这本书中提到的技术的确可以加速代码,但是在release版本下反而没有我们惯用的循环的效率高,我想大概是针对代码1,牛B的编译器可以对其进行深度的优化,(有可能就用到了类似memset类似的东西),但是对于代码2,这种不太“正常”的做法反而降低了编译器的优化效率。
代码3和代码2的原理一样,就是实现的时候方式不一样,因为多了几个变量,所以每次循环的时候负担略大,比代码2的时间复杂度高一点也可理解。
例如下面这段代码:
代码1:
const int length = 100000; float data[length]; memset(data,1,sizeof(float)*length); for ( int i = 0; i < length; ++i ) { data[i] = 3.0; }
我们在使用这个循环的时候,如果改用下面的这种形式:
代码2:
for ( int i = 0; i < length - 3; i += 3 ) { data[i] = 3.0; data[i+1] = 3.0; data[i+2] = 3.0; }
也就是在循环中每次处理三个数据,那么时间会大大降低,书中称为“unrolling"技术。
我想每次都用三个变量,同时处理三个数据会有神马效果呢?下面的代码3是我自己的想法
代码3:
int maxI = length/3; int maxJ = 2*length/3; for ( int i=0,j=length/3+1,k=2*length/3 +1; i<maxI && j<maxJ && k<length; ++i,++j,++k) { data[i] = 3.0; data[j] = 3.0; data[k] = 3.0; }
下面分别是debug和release版本的时间复杂度对比:
debug | release | |
代码1 | 0.242ms | 0.0ms |
代码2 | 0.101ms | 0.055ms |
代码3 | 0.121ms | 0.076ms |
在debug模式下,《深入理解计算机系统》这本书中提到的技术的确可以加速代码,但是在release版本下反而没有我们惯用的循环的效率高,我想大概是针对代码1,牛B的编译器可以对其进行深度的优化,(有可能就用到了类似memset类似的东西),但是对于代码2,这种不太“正常”的做法反而降低了编译器的优化效率。
代码3和代码2的原理一样,就是实现的时候方式不一样,因为多了几个变量,所以每次循环的时候负担略大,比代码2的时间复杂度高一点也可理解。
相关文章推荐
- 关于合理使用SpringMVC统一异常处理机制以改善代码风格的一些思考
- 关于代码重构的一些思考
- 《深入理解计算机系统》读书笔记2---关于存储的思考
- 关于代码的一些思考
- 关于C代码性能调优的简单思考
- 关于合理使用SpringMVC统一异常处理机制以改善代码风格的一些思考
- 关于精灵进程的一些思考和代码片段
- 关于设计文档与代码关系的一点思考
- 【五子棋AI循序渐进】关于VCT,VCF的思考和核心代码
- 关于提交代码频率的思考
- 关于360笔试题的一个题目的以下代码执行后输出结果为()思考
- 关于提交代码频率的思考
- 一次代码review引发的关于单例模式的思考
- 关于代码标准的思考
- 关于代码质量的一些思考
- 最近项目中一些关于代码编写管理的一些思考
- 代码回顾:关于写代码时cout 和printf 输出16进制数的简单思考
- 关于写代码的一些思考
- 关于代码测试的几点思考
- 关于M8开发区站长给的代码中SetDVS函数的思考