在消耗最少量资源的同时打印内容。
它甚至可以是0
或1
,不一定是test
fputs("test",stdout);
printf("%s", "test");
puts("test");
上述哪一项命令效率最高?
还有其他更高效的东西吗?
答案 0 :(得分:5)
三种备选方案之间的执行时间基本没有区别,一些优化编译器实际上会将printf
转换为fputs
之类的调用。因此,选择以您认为最清晰的方式做您想做的事情。
请注意puts("test");
在单词后面写了换行符。如果你想要换行,那么这可能是最干净的解决方案。如果您不想要换行,请使用其他两个中的一个。
在尝试优化代码时,请关注整体情况。你使用最好的算法吗?你在做不必要的工作吗?你能用更好的数据结构吗?相信编写编译器和标准库的人在优化常用习语方面做得很好。他们是优秀的程序员,他们的工作是专注于使您的代码运行得更快的小细节。
答案 1 :(得分:2)
这里基本上有两个答案。
(1)对于几乎所有实际目的,之间存在 no 性能差异(时间或其他资源)
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);
}
您会注意到我选择运行每次一亿次的测试。 (当我说'#34;你可能不得不进行数千或数百万次测试时,我不开玩笑#34;。)尽管如此,结果如下:
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
的两倍,至少在我的机器上是这样。但是,为了看到这种差异,我不得不称他们为一亿次这一事实表明,在现代机器上,如果你只做了几十,几百或几千甚至数百万或数千万的电话,你可能根本没有看到任何差异。
[P.S。我的测试程序不是严格便携的。我应该使用long int
作为计数器。]