打印到控制台与写入文件(速度) 在C++中,如果重复,则会更快,比如说5000次: cout << "text!" << endl; cout

打印到控制台与写入文件(速度) 在C++中,如果重复,则会更快,比如说5000次: cout << "text!" << endl; cout,c++,C++,使用相同的缓冲区大小将相同数量的数据写入控制台肯定比写入文件快 您可以通过不在每一行中写入缓冲区来加快写入速度(控制台输出和文件输出)(即,不要在每一行之后使用std::endl,因为它会向流中添加一个端点,并写入缓冲区)。除非出于某种原因需要确保输出缓冲区,否则请改用“\n”。写入文件会快得多。这一点尤其正确,因为您将在每一行之后使用endl刷新缓冲区 另一方面,你可以通过重复cout来显著加快打印速度,但速度没有那么快 使用endl(清除缓冲区)测试100万couts: 结果: consol

使用相同的缓冲区大小将相同数量的数据写入控制台肯定比写入文件快


您可以通过不在每一行中写入缓冲区来加快写入速度(控制台输出和文件输出)(即,不要在每一行之后使用std::endl,因为它会向流中添加一个端点,并写入缓冲区)。除非出于某种原因需要确保输出缓冲区,否则请改用“\n”。

写入文件会快得多。这一点尤其正确,因为您将在每一行之后使用
endl
刷新缓冲区


另一方面,你可以通过重复
cout来显著加快打印速度,但速度没有那么快

使用endl(清除缓冲区)测试
100万couts

结果:

console cout time: 2.87001
file cout time: 2.33776
代码:


除了控制台I/O通常相对较慢外,标准流
cout
cin
的默认配置还存在一些问题,如果不加以纠正,将大大降低性能

<>原因在于,默认情况下,C++(C++)IoSt流库中的“代码> CUT和 CIN < /代码>应按C方式在C STDIO库中同时执行<代码> STDUD> <代码>和 STDIN <代码>。 这基本上意味着
cout
cin
在其内部
streambuf
s中根本无法进行任何缓冲,并且基本上将所有I/O操作转发给C库

如果您想使用标准流执行类似于高性能I/O的操作,则需要使用关闭此同步

std::ios_base::sync_with_stdio(false);

在进行任何I/O之前。

除非您通过非常慢的串行链接进行输出。包括在打印到控制台时可以看到的所有打印和滚动?在文本文件中,您将看不到正在写入的文本。写入控制台的速度更快,但如果只执行了写入操作,则写入文件的程序可能会首先完成。@vorbis5:您也不一定在终端中看到它。当我为一家金融数据提供商工作时,服务器日志的写入速度太快,无法在当时的Solaris xterm中跟踪,但在rxvt中没有问题,这正是因为它足够聪明,可以限制每秒的重画次数,并让数据以不可见的方式通过,但如果您费心向后滚动,最后的N行仍在缓冲区中。不过,固定长度的内存缓冲区的维护压力比在磁盘上增加文件要小。你无法确定标准输出重定向的目的是什么,但磁盘访问(如在文件上写入)比ram访问(打印控制台)慢得多。@Julio:你在真实环境中测试过吗?打印到控制台通常比写入磁盘慢得多,这不仅仅是将字符留在缓冲区中,而且缓冲区是有限的,缓冲区的内容需要移动到视频卡(真实文本终端)或在屏幕(图形终端)上绘制足够的数据,中间缓冲区将填充,写入进程暂停,等待输出被绘制。。。在对性能做出这种强有力的陈述之前,实际上要在一个有足够数据的真实环境中进行测量,你自己会看到的。@David Rodríguez-dribeas+1:真的很有趣,谢谢这听起来可能很愚蠢。。。缓冲区到底是什么?当您向流(如cout)输出某些内容时,您发送的任何内容都会在实际放入(刷新)缓冲区之前存储在缓冲区中。它时不时地发生,当程序正确地完成执行时。但是,使用flush或endl显式刷新它。这只会确保在我们需要的时候打印出来。
class Timer
{
        struct timespec startTime, endTime;
        double sec;
public:
        void start();
        void stop();
        double getSec();
};

void Timer::start()
{
        clock_gettime(CLOCK_MONOTONIC, &startTime);
}
void Timer::stop()
{
        clock_gettime(CLOCK_MONOTONIC, &endTime);
        sec = (endTime.tv_sec - startTime.tv_sec);
        sec += (endTime.tv_nsec - startTime.tv_nsec) / 1000000000.0;
}
double Timer::getSec()
{
        return sec;
}


int main(){
        int ntests = 1000000;
        Timer t1 = Timer(), t2 = Timer();

        t1.start();
        for(int c=0;c<ntests;c++)
        {
                cout << "0" << endl;
        }
        t1.stop();

        ofstream out("out.txt");
        streambuf *coutbuf = cout.rdbuf();
        cout.rdbuf(out.rdbuf());
        t2.start();
        for(int c=0;c<ntests;c++)
        {
                cout << "0" << endl;
        }
        t2.stop();
        cout.rdbuf(coutbuf);

        cout << "console cout time: " << t1.getSec() << endl;
        cout << "file cout time: " << t2.getSec() << endl;
}
g++ test.cpp -o test -lrt && ./test && rm out.txt
std::ios_base::sync_with_stdio(false);