我一直认为,多次调用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代码,应该遵循哪种方式?
您对应该更快的速度的直觉是错误的。通常,每个字节写入putc
/putchar
将有大量开销,因为每个字节都有一个完整的函数调用周期,目标stdio流(stdout
)的潜在锁定等。另一方面,函数每次调用的开销大于printf
或等于(例如,必须处理格式字符串,并且必须调用或等效函数),但是无论您要写入多少字节,开销都只会发生一次。实际写入可以作为对的缓冲区的批量复制,也可以作为对基础文件的批量写入(如果未缓冲)。puts
putc
printf
puts
strlen
FILE
FILE
至于优化级别如何影响这一点,-O0
在进行以更高优化级别进行优化的函数调用时,可能会有更多开销。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句