最有效的方法来打印“测试”?

在消耗最少量资源的同时打印内容。

它甚至可以是01不一定是test

 fputs("test",stdout); printf("%s", "test"); puts("test"); 

以上哪个命令最有效?

还有其他更高效的东西吗?

这里基本上有两个答案。

(1)对于几乎所有实际目的,两者之间的性能(时间或其他资源) 没有差异

 puts("test"); fputs("test\n",stdout); printf("%s\n", "test"); fprintf(stdout, "%s\n", "test"); 

(如图所示,在换行处理方面存在一些差异。)

使用最清晰的,对你的程序有意义的; 这里不要担心效率。

(2)任何forms的问题“哪一个最快?” 只能在特定环境的背景下回答,并且通常无法预测。 如果您真的关心,除了在您的确切环境中进行经验测试之外,您基本上没有其他选择。 请注意,由于性能差异可能很小(参见答案1),您可能需要执行数千或数百万次测试才能获得统计上显着的答案 – 这几乎强调了实际上,任何差异可能都无关紧要。


现在,为了好玩,我进行了测试。 这是一个测试所有四个备选方案的小程序,以及低级write系统调用:

 #include  #include  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)是错误的。 有一个区别: putsfputs的速度是printffprintf两倍,至少在我的机器上是这样。 但为了看到这种差异,我不得不称它们为一亿次,这表明,在现代机器上,如果你只做几十或几百或几千甚至数百万或数千万的电话,你可能根本看不出任何差异。

[PS我的测试程序不是严格便携的。 我应该使用long int作为计数器。]

三种备选方案之间的执行时间基本没有区别,一些优化编译器实际上会将printf转换为对printf的调用。 因此,选择以您认为最清晰的方式做您想做的事情。

注意puts("test"); 在单词后写一个换行符。 如果你想要换行,那么这可能是最干净的解决方案。 如果您不想要换行,请使用其他两个中的一个。

在尝试优化代码时,请关注整体情况。 你使用最好的算法吗? 你在做不必要的工作吗? 你能用更好的数据结构吗? 相信编写编译器和标准库的人在优化常用习语方面做得很好。 他们是优秀的程序员,他们的工作是专注于使您的代码运行得更快的小细节。