zoukankan      html  css  js  c++  java
  • 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有所优化?

  • 相关阅读:
    MySQL进阶:主主复制+Keepalived高可用
    Zabbix 5.0:磁盘自动发现和读写监控
    Zabbix 5.0 优化建议
    容器进阶:OCI与容器运行时
    openresty快速安装
    ansible:playbook详解
    Shell:如何遍历包含空格的文本
    Linux性能优化:内存使用情况分析
    Shell:如何写一个多选菜单的脚本
    算法路漫漫(二) 递归与归并
  • 原文地址:https://www.cnblogs.com/lhfcws/p/3197735.html
Copyright © 2011-2022 走看看