为什么有或没有const改性剂使效率差4倍?这段代码需要大约16秒才能在我的电脑上完成。但是,如果我做了一个小的更改,比如将mod声明为const,或者在主体中移动mod声明,或者将i更改为int类型,则执行时间将减少到4秒。(我编译了这段代码,使用带有默认参数的g++ )
这里是该代码的汇编代码,左边部分是用非const生成的,另一部分是使用const声明生成的。
只有当我声明I为长且for循环中的运算符为'%‘时,效率才会很高。否则,性能只差10%左右。
// const int mod = 1000000009;
int mod = 1000000009;
int main(){
// int mod = 1000000009;
int rel = 0;
for(long long i=1e9; i<2*(1e9); i++){
rel = i % mod;
}
return 0;
}发布于 2014-11-21 08:55:34
将mod的值从内存加载到寄存器时,生成的程序集代码是不同的。
例如,在基于x64的处理器上使用Visual 2013编译器时,您会得到如下结果:
用于int mod = 1000000009**:**的
mov eax,dword ptr ds:[xxxxxxxxh] ; xxxxxxxxh = &mod
cdq
push edx
push eax用于const int mod = 1000000009**:**的
push 0
push 3B9ACA09h ; 3B9ACA09h = 1000000009发布于 2015-10-29 11:03:35
因为当您添加const时,编译会将其更改为常量值并将其写入组装代码中,但是当您不添加const时,该值将被加载到寄存器中,因此每次必须使用它时都必须查询它。
发布于 2014-11-21 08:19:40
const变量可能占用堆栈空间,也可能不占用空间,这取决于编译器。但是,在大多数情况下,const-变量的使用将被其常量所取代.考虑:
const int size = 100;
int* pModify = (int*)&size;
*pModify = 200;
int Array[size];当您使用*pModify时,它将呈现200、但数组的大小将仅为100元素(忽略允许可变大小数组的新特性的编译器扩展)。这仅仅是因为编译器已经用[100]取代了[100]。当您使用size时,它将主要是100。
在这个循环中,%mod只是被%1000000009所取代。有一个读取内存(加载)指令较少,这就是为什么它的执行速度快。
但是,必须注意的是,编译器很聪明,非常聪明,所以您无法猜测它可能应用了什么优化技术。它可能已经删除了所有循环(因为它在编译器看来是没有操作的)。
https://stackoverflow.com/questions/27056402
复制相似问题