OFstream比cout更快? ||存储速度比视觉输出快

时间:2014-01-04 08:24:06

标签: c++ file-io cout ofstream

无论出于何种原因,我决定制作一个非常简单的应用程序,显示1-1,000,000的所有数字。我注意到显示结果比存储它们要花费更长的时间。我认为存储所有值所需的时间比显示它们要多。我还记得阅读,如果我没记错的话,用户输入和从控制台应用程序中的文本文件读取之间没有任何区别,所以我认为显示和存储是相同的。 有人可以解释为什么会这样吗?根据这本书,我读的ofstream与cout非常相似,所以我不明白为什么需要更长的时间。

为什么使用cout显示结果比使用ofstream将结果存储在文本文件中要慢?

cout = 169.168秒

ofstream = 3.473秒

ofstream方法

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

namespace patch //used to patch some C++11 functions not included in mingw 4.7 // to_string
{
    template < typename T > std::string to_string( const T& n )
    {
        std::ostringstream stm ;
        stm << n ;
        return stm.str() ;
    }
}
using namespace patch;
using namespace std;

int main()
{
    int minimumRange = 1; //sets minimum number in range
    int maximumRange = 1000000; // sets maximum number in range
    string strRanges = to_string(minimumRange) + "-" + to_string(maximumRange); //appends string names
    ofstream myRange;
    myRange.open(strRanges + ".txt");

    for (int i = minimumRange; i<=maximumRange; ++i)
    {
        myRange << to_string(i) << "\n";
    }
   myRange.close();
    return 0;
}

cout方法

#include <iostream>
using namespace std;

int main()
{
    int minimumRange = 1;
    int maximumRange = 1000000;
    for (int i = minimumRange; i<=maximumRange; ++i)
    {
        cout << i << "\n"; //using "/n" instead of endl; for speed purposes
    }
    return 0;
}

1 个答案:

答案 0 :(得分:4)

在许多系统上,cout只是映射ostream文件的CON实例。

重点是ostream不写任何东西。

其目的是转换任何支持的类型(maninly:const char*std::stringintlong ...,double ...)放入缓冲区中的“字符序列”(参见std::streambuf)。

从这个意义上说,存储或打字也是如此。

当缓冲区字符必须向物理设备吐出时出现差异:这就是设备驱动程序和相关物理问题(主要是:带宽,延迟和交错)发挥作用的地方。 / p>

当操作系统将大量数据传输到磁盘文件时,它会使用一个内部使用缓存的驱动程序,该缓存使用通信协议(主要是SATA,SCSI,NFS ......)与外部设备通信控制器(磁盘上的微型计算机)也有其缓存,以后操作磁存储。

你的程序说“写”,操作系统告诉“写入”,但数据仍由设备控制器在操作系统控制之外。 “缓慢”的部分与您同步发生。

当您必须写入控制台时,大多数“缓存”都无法完成:只要您等待输入,就会刷新cout(如果这是一个您必须回答的问题,您想要阅读您所写的内容) )。

因此,控制台驱动程序必须等待控制台程序完成其写入才能继续。但它的写作实际上是一幅“绘画”:必须通过字体将字符转换为像素,并且绘画必须与显示扫描同步(否则图像将被“干扰”)。

这个过程比“写入磁盘”更慢(更长) - 事实上 - 转换为“将大量内存从进程移动到IO端口”(硬件可以通过交换两个来实现这一点)指针寄存器)

此外,控制台程序针对要查看的数据进行了优化(并且使其比眼睛更快没有意义),而磁盘驱动程序针对要传输的数据进行了优化。它变得更快是很正常的。