console ouput 与 重定向输出 效率对比

昨天做一个程序的性能测试的时候,由于用了自动化脚本,测试的时候直接把结果(包括执行时间等信息)输出到文件。后来我在调整源代码的时候单独跑了可执行文件,此时结果是输出到控制台(printf)。大约100k数据平均竟相差了54%,显然是控制台输出的时间消耗会较大。

这个问题困扰了我差不多十几分钟,还特地细心比对了编译版本等影响因素。后来经过各种方法比对测试才发现,很可能是console output比管道重定向输出到文件耗时要多。

其实这个问题如果面试问起来许多人有点经验应该都知道会选console output 慢,但现实中自己自测的时候受很多因素影响,不一定能顾及的面面俱到。

既然知道了这个问题干脆我就亲自验证一下:

 1 #include <cstdio>
 2 #include <ctime>
 3 
 4 int main() {
 5     double start = clock();
 6     
 7     for (int i = 0; i < 1000000; i++) {
 8         printf("Test.
");
 9     }
10 
11     double during = double(clock() - start) / CLOCKS_PER_SEC;
12     printf("Time cost:  %lf
", during);
13 
14     return 0;
15 }

一个简单的小程序,两种方法输出。

$[lhfcws] ./main
$[lhfcws] ./main > main.file

然后是结果:

                    

可以看到,控制台输出 2.98s , 重定向文件输出 0.04s,简直不是一个数量级的。

确定了结论,确实是 控制台输出要比重定向文件输出要慢,而且慢很多!

知道结论很简单,关键是原理。

来自StackOverflow的解释:http://stackoverflow.com/questions/7404551/why-is-console-output-so-slow

主要原因:  Console 会给多个进程共享,因此对console操作时会存在进程同步和缓存问题。

目前只搜索到这个原因。我自己还有猜测另外一个原因,会不会是文件输出是写磁盘会OS有所优化?

原文地址:https://www.cnblogs.com/lhfcws/p/3197735.html