怎么优化void程序的性能

70次阅读
没有评论

共计 1935 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要介绍“怎么优化 void 程序的性能”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么优化 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() 函数,而这个函数明显是要拖累性能的,实际上我们只需要计算一次长度就可以了,现在却每次循环都需要去计算一次长度,所以可以将计算移到前面只计算一次的地方。

void lower2(char *s){
 long i;
 long len = strlen(s);
 for(i = 0; i   len; i++){
 if(s[i]  =  A    s[i]  =  Z ){
 s[i] -= (A  -  a
 }
 }
}

编译器虽然会试着去进行代码的移动,但是最终还是没有优化,是因为改变在哪里调用函数或者调用多少次函数的变换,编译器并不能比较可靠的发现一个函数是否有副作用,比如下面的情况。

long f();

long func1(){
 return f() + f() + f() + f();
}

long func2(){
 return 4*f();
}

这段代码和开篇提到的代码在形式上很像,可能你会说:它们不会指到同一块内存了呀,编译器这也不去优化吗?考虑一下 f() 是下面的形式。

long count = 0;

long f(){
 return count++;
}

是不是一下就发现问题了,func1() 调用 4 次 f(),而 func2() 只调用 1 次 f(),它们最终的结果绝不是简单的 4 倍关系。

编写适合条件传送实现的代码

如果编译器能够产生使用条件数据传送而不是条件控制转移的代码,那么就可以大大的提高程序的性能,关于条件数据传送和条件控制转移在旧文顺序、条件、循环语句的底层解释中描述的已经很明确了。比如下面的第一种写法就比第二种要好。

//  第一种 
void minmax1(long a[], long b[], long n){
 long i;
 for(i = 0; i   n; i++){
 if(a[i]   b[i]){
 long t = a[i];
 a[i] = b[i];
 b[i] = t;
 }
 }
}

//  第二种
void minmax2(long a[], long b[], long n){
 long i;
 for(i = 0; i   n; i++){
 long min = a[i]   b[i] ? a[i] : b[i];
 long max = a[i]   b[i] ? b[i] : a[i];
 a[i] = min;
 b[i] = max;
 }
}

关于“怎么优化 void 程序的性能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1935字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)