大学の仕事のため、単純な最適化であるインライン化を調査する必要があります。
基本的なコードは次のとおりです。
#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 は、プログラム自体が使用した時間だけでなく、全体の時間をカウントすることを知っていますが、その関数を具体的に使用する必要があります。
前もって感謝します!