您的位置:首页 > 理论基础

关于《深入理解计算机系统》代码加速的思考

2013-08-13 17:21 141 查看
在《深入理解计算机系统》这本书的时候,有一个这样的知识点引起了我的注意:

例如下面这段代码:

代码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版本的时间复杂度对比:

 debugrelease
代码10.242ms0.0ms
代码20.101ms0.055ms
代码30.121ms0.076ms
大家首先对比代码1和代码2
在debug模式下,《深入理解计算机系统》这本书中提到的技术的确可以加速代码,但是在release版本下反而没有我们惯用的循环的效率高,我想大概是针对代码1,牛B的编译器可以对其进行深度的优化,(有可能就用到了类似memset类似的东西),但是对于代码2,这种不太“正常”的做法反而降低了编译器的优化效率。

代码3和代码2的原理一样,就是实现的时候方式不一样,因为多了几个变量,所以每次循环的时候负担略大,比代码2的时间复杂度高一点也可理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: