putc を複数回呼び出す方が、puts や printf よりも高速であると常に考えていました。たとえば「hello」を出力するには、実際のプログラムでは常に puts または printf を使用しますが、現在は C コードを生成するプログラムを作成しているため、コードを生成するかどうかputchar('h'); putchar('e') ...
は最初はもっとあるべきだと思っていたので迷っていました。もっと早く。しかし、非常に興味深い結果が得られたテストを実行しました。コンパイラは GCC です。
#include <stdio.h>
#include <time.h>
int main() {
time_t timer;
FILE *f;
int i;
f = fopen("out.txt", "w");
#define START_TIMER(TIMER) TIMER = clock()
#define ELAPSED_TIME(TIMER)\
(double)(clock() - TIMER) / (double)CLOCKS_PER_SEC
enum { NUM_ITERS = 9999999 };
START_TIMER(timer);
for (i = 0; i < NUM_ITERS; i++) {
putc('h', f);
putc('e', f);
putc('l', f);
putc('l', f);
putc('o', f);
putc('\n', f);
}
printf("%.3f\n", ELAPSED_TIME(timer));
START_TIMER(timer);
for (i = 0; i < NUM_ITERS; i++) {
fputs("hello", f);
}
printf("%.3f\n", ELAPSED_TIME(timer));
START_TIMER(timer);
for (i = 0; i < NUM_ITERS; i++) {
fprintf(f, "hello\n");
}
printf("%.3f\n", ELAPSED_TIME(timer));
return 0;
}
最適化なしの結果:
4.247 1.013 1.195
最適化 (-O2) による結果:
0.910 1.184 1.315
最適化の結果 (-O3):
0.920 1.158 1.311
したがって、putc を複数回呼び出すと、最適化せずに単純に実行する場合、printf の puts よりも遅くなります。まず、その理由が気になります。次に、プログラムで生成された C コードについては、どの方法に従うべきですか?