这里基本上有两个答案。
(1) 就几乎所有实际目的而言,两者在性能(时间或使用的其他资源)方面没有差异
puts("test");
fputs("test\n",stdout);
printf("%s\n", "test");
fprintf(stdout, "%s\n", "test");
(在换行符处理方面存在一些差异,如图所示。)
使用最清晰且对您的程序有意义的一个;不用担心这里的效率。
(2) 任何形式的问题“其中哪一个最快?”只能在特定环境的上下文中回答,一般无法预测。如果您真的很在意,那么除了在您的确切环境中执行经验测试之外,您基本上别无选择。请注意,由于性能差异充其量可能很小(请参阅答案 1),您可能必须执行数千或数百万次测试才能获得具有统计意义的答案 - 这几乎强化了这一点,实际上,任何差异都可能无关紧要。
现在,只是为了好玩,我进行了一个测试。下面是一个小程序,用于测试所有四个备选方案,以及低级 write 系统调用:
#include <stdio.h>
#include <time.h>
int main()
{
int count = 100000000;
time_t t1, t2;
int delta;
int i;
t1 = time(NULL);
for(i = 0; i < count; i++) puts("test");
t2 = time(NULL);
delta = (int) t2 - t1;
fprintf(stderr, "test 1: %d secs (%f prints/sec)\n",
delta, (double)count/delta);
t1 = t2;
for(i = 0; i < count; i++) fputs("test\n", stdout);
t2 = time(NULL);
delta = (int) t2 - t1;
fprintf(stderr, "test 2: %d secs (%f prints/sec)\n",
delta, (double)count/delta);
t1 = t2;
for(i = 0; i < count; i++) printf("%s\n", "test");
t2 = time(NULL);
delta = (int) t2 - t1;
fprintf(stderr, "test 3: %d secs (%f prints/sec)\n",
delta, (double)count/delta);
t1 = t2;
for(i = 0; i < count; i++) fprintf(stdout, "%s\n", "test");
t2 = time(NULL);
delta = (int) t2 - t1;
fprintf(stderr, "test 4: %d secs (%f prints/sec)\n",
delta, (double)count/delta);
t1 = t2;
for(i = 0; i < count; i++) write(1, "test\n", 5);
t2 = time(NULL);
delta = (int) t2 - t1;
fprintf(stderr, "test 5: %d secs (%f prints/sec)\n",
delta, (double)count/delta);
}
您会注意到我已选择运行每个测试一亿次。 (当我说“您可能需要执行数千或数百万次测试”时,我并不是在开玩笑。)不过,结果如下:
test 1: 9 secs (11111111.111111 prints/sec)
test 2: 8 secs (12500000.000000 prints/sec)
test 3: 17 secs (5882352.941176 prints/sec)
test 4: 16 secs (6250000.000000 prints/sec)
test 5: 45 secs (2222222.222222 prints/sec)
所以,从某种意义上说,我的答案 (1) 是错误的。有一点不同:至少在我的机器上,puts 和 fputs 的速度大约是 printf 和 fprintf 的两倍。但是我必须调用它们一亿次才能看到这种差异这一事实表明,在现代机器上,如果你只进行几千万或几百或几千甚至几百万或几千万次调用,你可能根本看不到任何区别。
[附注我的测试程序不是严格可移植的。我应该使用long int 作为柜台。]