您现在的位置是:主页 > 数据库技术 > 数据库技术

怎么优化void程序的性能

IDCBT2022-01-10服务器技术人已围观

简介这篇文章主要介绍“怎么优化void程序的性能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么优化void程序的性能”文章能帮助大家

这篇文章主要介绍“怎么优化void程序的性能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么优化void程序的性能”文章能帮助大家解决问题。

我们的编译器已经提供了很好的优化机制,但是还有很多细节编译器优化不到,或者说没胆量去优化,因为有一些激进的优化很有可能会违背程序员的初心。

// 第一种
void twiddle1(long *xp, long *yp){
    *xp += *yp;
    *xp += *yp;
}

// 第二种
void twiddle2(long *xp, long *yp){
    *xp += 2* *yp;
}

例如上面的程序,看到第一种写法,我们可能很容易的就想到第二种写法,但是编译器却不会把它变成这种写法。乍看它们没什么区别,我们来分析一下内存引用。第一种需要 3 次内存引用,即读\*xp、读\*yp、写\*xp;而第二种却需要 6 次内存引用,即2 次读\*xp、2 次读\*yp、2 次写\*xp。所以第一种的性能要比第二种好。

那编译器看到第一种为什么就想不到第二种写法呢?这不是很简单的规则吗?实际上上面的程序存在xp = yp的情况,即两个指针指向同一个内存位置。

// 第一种
*xp += *yp; // xp 处存放的值乘以 2
*xp += *yp; // xp 处存放的值乘以 2

// 第二种
*xp += 2* *yp; // xp 处存放的值乘以 3

可以看到,当它们都指向同一块内存时,第一种写法会让原来的值增加 4 倍,而第二种写法会让原来的值增加 3 倍,产生了不同的效果,而编译器会当这种情况可能出现,所以编译器并不会帮我们优化第一种代码,这需要程序员自己去维护。

消除循环的低效率

相信很多人都写过下面类似的代码,貌似没有什么可以优化的,写的挺好。

void lower1(char *s){
    long i;
    for(i = 0; i < strlen(s); i++){
        if(s[i] >= 'A' && s[i] <= 'Z'){
            s[i] -= ('A' - 'a');
        }
    }
}

仔细看,会发现每次循环都会去调用strlen()函数,而这个函数明显是要拖累性能的,实际上我们只需要计算一次长度就可以了,现在却每次循环都需要去计算一次长度,所以可以将计算移到前面只计算一次的地方。

标签:

很赞哦! ()

本栏推荐