无论出于何种原因,我决定制作一个非常简单的应用程序,显示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;
}
答案 0 :(得分:4)
在许多系统上,cout
只是映射ostream
文件的CON
实例。
重点是ostream不写任何东西。
其目的是转换任何支持的类型(maninly:const char*
,std::string
,int
,long
...,double
...)放入缓冲区中的“字符序列”(参见std::streambuf
)。
从这个意义上说,存储或打字也是如此。
当缓冲区字符必须向物理设备吐出时出现差异:这就是设备驱动程序和相关物理问题(主要是:带宽,延迟和交错)发挥作用的地方。 / p>
当操作系统将大量数据传输到磁盘文件时,它会使用一个内部使用缓存的驱动程序,该缓存使用通信协议(主要是SATA,SCSI,NFS ......)与外部设备通信控制器(磁盘上的微型计算机)也有其缓存,以后操作磁存储。
你的程序说“写”,操作系统告诉“写入”,但数据仍由设备控制器在操作系统控制之外。 “缓慢”的部分与您同步发生。
当您必须写入控制台时,大多数“缓存”都无法完成:只要您等待输入,就会刷新cout(如果这是一个您必须回答的问题,您想要阅读您所写的内容) )。
因此,控制台驱动程序必须等待控制台程序完成其写入才能继续。但它的写作实际上是一幅“绘画”:必须通过字体将字符转换为像素,并且绘画必须与显示扫描同步(否则图像将被“干扰”)。
这个过程比“写入磁盘”更慢(更长) - 事实上 - 转换为“将大量内存从进程移动到IO端口”(硬件可以通过交换两个来实现这一点)指针寄存器)
此外,控制台程序针对要查看的数据进行了优化(并且使其比眼睛更快没有意义),而磁盘驱动程序针对要传输的数据进行了优化。它变得更快是很正常的。