3

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 コードについては、どの方法に従うべきですか?

4

1 に答える 1