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.\n"); 9 } 10 11 double during = double(clock() - start) / CLOCKS_PER_SEC; 12 printf("Time cost: %lf\n", 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有所优化?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步