“因为太简单 所以被我们忽视” ~从细节中优化你的代码

 

先让我们来看一段非常简单的代码:

#include<stdio.h>

#include<stdlib.h>

int arraysum (int array[], const int n)

{

     int sum = 0, *ptr;

for (ptr=array; ptr <= array + n; ++ptr)

sum += *ptr;

return sum;

}

int main (void)

{

int arraysum (int array[], const int n);

int values[10]={3,7,-9,3,6,-1,7,9,1,-5};

printf("The  sum is %i\n",arraysum(values,10);

return 0;

}

 

在函数内部,我们定义了整形指针变量ptr用来遍历数组形参。每一次循环都将ptr间接取得的数值加入SUM中。这样,我们就完成了一个数组的元素进行求和的函数。

你会问,这断码有什么可优化的吗?

请看如下代码:

#include<stdio.h>

#include<stdlib.h>

int arraysum (int array[], const int n)

{

     int sum = 0, *ptr;

     int * const arrayEnd = array + n;

for (ptr=array; ptr <= arrayEnd; ++ptr)

sum += *ptr;

return sum;

}

int main (void)

{

int arraysum (int array[], const int n);

int values[10]={3,7,-9,3,6,-1,7,9,1,-5};

printf("The  sum is %i\n",arraysum(values,10);

return 0;

}

修改后的代码我们定义了整形指针常量arrayEnd,并将其指向数组最后一个元素的后面。

使用arrayEnd的唯一目的是为了优化。每一次循环,程序都要计算循环条件表达式。

因为我们在循环里从没改变表达式array+n,所以它在循环中为一个常量。如果我们在进入循环前将它计算出来,我们就可以省去每一次循环中计算这个常量的时间。 也许在这个10个元素的数组中不能体现出它的效率。但是如果程序频繁的调用这个函数对一个很大的数组求和,例如中国人均收入,那么节省下来的时间就相当可观了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值