估计应该都知道算除法的效率比算+-*低好多,那么到底低多少呢?简单写了一个程序测试看看。
注意:avg0函数可能会碰到溢出的情况,这种方法尽量不要用。
- avg0: 统一加起来,再做除法;
- avg1: 加的时候就做除法;
- avg2: 加的时候乘以预先算好的,分母的倒数;
void printDuration(clock_t start, clock_t end){
cout << "Time elapsed: " << (end - start)/(float)CLOCKS_PER_SEC << " seconds." << endl;
}
double avg0(int* ary, int N, long again){
cout << "avg0: ";
clock_t start = clock();
double sum;
while(again > 0){
sum = 0;
for(int i=0; i<N; i++)
sum += ary[i];
sum /= (double)N;
again --;
}
clock_t end = clock();
printDuration(start, end);
return sum;
}
double avg1(int* ary, int N, long again){
cout << "avg1: ";
clock_t start = clock();
double sum = 0;
while(again > 0){
for(int i=0; i<N; i++)
sum += ary[i]/(double)N;
again--;
}
clock_t end = clock();
printDuration(start, end);
return sum;
}
double avg2(int* ary, int N, long again){
cout << "avg2: ";
clock_t start = clock();
double sum = 0;
while(again > 0){
double denominator = 1 / (double)N;
for(int i=0; i<N; i++)
sum += ary[i] * denominator;
again--;
}
clock_t end = clock();
printDuration(start, end);
return sum;
}
int main() {
int N;
long again;
cin >> N >> again; //num of numbers to be generated
srand(time(NULL));
int* ary = new int[N];
for(int i=0; i<N; i++)
ary[i] = rand();
double r0 = avg0(ary, N, again);
double r1 = avg1(ary, N, again);
double r2 = avg2(ary, N, again);
return 0;
}
结果:
50000 50000 avg0: Time elapsed: 7.49197 seconds. avg1: Time elapsed: 16.7689 seconds. avg2: Time elapsed: 7.51349 seconds. Process finished with exit code 0
比一倍还多的时间!可怕!





