putc和putchar的性能?

xiver77

我一直认为,多次调用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代码,应该遵循哪种方式?

R .. GitHub停止帮助ICE

您对应该更快的速度的直觉是错误的。通常,每个字节写入putc/putchar将有大量开销,因为每个字节都有一个完整的函数调用周期,目标stdio流(stdout)的潜在锁定等。另一方面,函数每次调用的开销大于printf等于(例如,必须处理格式字符串,并且必须调用或等效函数),但是无论您要写入多少字节,开销都只会发生一次。实际写入可以作为对的缓冲区的批量复制,也可以作为对基础文件的批量写入(如果未缓冲)。putsputcprintfputsstrlenFILEFILE

至于优化级别如何影响这一点,-O0在进行以更高优化级别进行优化的函数调用时可能会有更多开销。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章