由于大学工作,我不得不研究一个简单的优化,即内联。
这是基本代码:
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#define ITER 1000
#define N 3000000
int i, j;
float x[N], y[N], z[N];
void add(float x, float y, float *z){
*z = x + y;
}
void initialVersion(){
struct timeval inicio, final;
double time;
gettimeofday(&inicio, 0);
for(j = 0; j < ITER; j++){
for(i = 0; i < N; i++){
add(x[i], y[i], &z[i]);
}
}
gettimeofday(&final, 0);
time = (final.tv_sec - inicio.tv_sec + (final.tv_usec - inicio.tv_usec)/1.e6);
printf("Time: %f\n", time);
}
这是带有内联的代码:
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#define ITER 1000
#define N 3000000
int i, j;
float x[N], y[N], z[N];
void inliningVersion(){
struct timeval inicio, final;
double time;
gettimeofday(&inicio, 0);
for(j = 0; j < ITER; j++){
for(i = 0; i < N; i++){
z[i] = x[i] + y[i];
}
}
gettimeofday(&final, 0);
time = (final.tv_sec - inicio.tv_sec + (final.tv_usec - inicio.tv_usec)/1.e6);
printf("Time: %f\n", time);
}
使用选项 -O0 和 gcc 进行编译,基本版本的结果是 14.27 秒,内联版本的结果是 4.45 秒。这很常见吗?我执行了该程序 10 次,结果总是相似的。你怎么看?
然后,使用选项 -O1 编译两个版本的结果相似,大约为 1.5 秒,所以我想gcc 为我使用 O1 进行内联。
顺便说一句,我知道 gettimeofday 计算总时间,而不仅仅是程序本身使用的时间,而且我需要专门使用该功能。
提前致谢!