我正在阅读加速版的c++,作者写道:
在适当的时候刷新输出缓冲区是一个重要的习惯,当您正在编写可能需要很长时间运行的程序时。否则,程序的某些输出可能会在编写程序时和看到程序之间很长一段时间在系统缓冲区中衰退。
如果我误解了其中任何一个概念,请纠正我:
我发现了这样的解释:
冲洗输出设备意味着需要立即完成所有前面的输出操作。这与缓冲问题有关,这是操作系统使用的一种优化技术。粗略地说,操作系统保留(并且通常使用)将数据“待命”的权利,直到它决定有足够大的数据量来证明将数据发送到屏幕上的相关成本。但是,在某些情况下,我们需要保证程序中执行的输出操作在程序执行过程中的给定点完成,因此我们刷新输出设备。
根据这一解释,我看到导致系统刷新缓冲区的三个事件:
std::cin >> name ;类似吗?尽管我不想完全理解以下几点:
发布于 2012-05-30 06:21:05
使用your_stream.flush();显式地刷新流。
什么是输出缓冲区与仅仅是缓冲区和假定的其他类型的缓冲区..。
缓冲区通常是用来保存等待处理的数据的内存块。一个典型的用途是刚刚从流中读取的数据,或者等待写入磁盘的数据。无论哪种方式,一次读/写大块数据通常更有效,因此一次读/写整个缓冲区,但是客户端代码可以以任何方便的方式读写(例如,一次读/写一个字符或一行)。
冲缓冲器意味着什么。这是否意味着清除公羊?
这要看情况了。对输入缓冲器来说,是的,它通常意味着只清除缓冲区的内容,丢弃被读取到缓冲区中的任何数据(尽管通常不清除RAM --它只是设置内部簿记以说明缓冲区是空的)。
对于输出缓冲区,刷新缓冲区通常意味着强制将缓冲区中的任何数据立即写入关联流。
上述解释中所指的“输出装置”是什么?
当你写数据的时候,它是你最终要写到的任何设备。它可以是磁盘、屏幕等上的文件。
最后,在这一切之后,当时机适合冲洗你的buffer...ugh时,听起来并不令人愉快。
当您完成一段时间的数据编写时,一个明显的时机是正确的,您将回到在一段时间内不会产生任何输出(至少到同一个目的地)的处理(或其他什么)。你不想刷新缓冲区,如果你可能产生更多的数据,然后再去同一个地方--但是你也不想把数据留在缓冲区里,当你在填充缓冲区(或者其他什么)之前会有一个明显的延迟时,数据就会被写入到它的目的地。
发布于 2012-05-30 07:53:06
要刷新std::ostream,可以使用std::flush机械手。即
std::cout << std::flush;注意,std::endl已经刷新了流。因此,如果您习惯于用它结束插入,则不需要做任何额外的操作。请注意,这意味着如果您看到性能不佳,因为您刷新太多,您需要从插入std::endl切换到插入换行符:'\n'。
流是一个字符序列(即char类型的事物)。输出流是向其写入字符的流。典型的应用程序是将数据写入文件、在屏幕上打印文本或将它们存储在std::string中。
流通常具有这样的特性:一次编写1024个字符是一个数量级(或更多)!比一次写一个字符快1024次。“缓冲”概念的主要目的之一是以方便的方式处理这一问题。而不是直接写到任何你真正想要的字符去,而是写到缓冲区。然后,当你准备好的时候,你“冲洗”缓冲区:你把字符从缓冲区移到你想要的地方。或者,如果您不关心确切的细节,则使用自动刷新自身的缓冲区。例如,std::ofstream中使用的缓冲区通常是固定大小的,当缓冲区满时就会刷新。
你问,什么时候是冲水的合适时机?我说你是过早地优化了。与其寻找最完美的时刻来冲洗,不如经常这样做。放入足够多的刷新,以便足够频繁地刷新,这样您就不会发现自己处于这样一种情况下,例如,您希望查看文件中的数据,但它位于缓冲区中。如果真的有太多的潮水伤害表现,那就是你花时间研究它的时候了。
发布于 2012-05-30 05:58:59
这在很大程度上取决于应用程序的类型,但经验法则之一是在编写一条记录之后刷新。对于通常在每一行之后的文本,对于每个对象之后的二进制数据。如果性能看起来很慢,那么刷新您编写的每一条X记录,然后用X进行实验,直到您对性能满意时找到一个数字,而当X不够大时,您就会在崩溃时丢失过多的数据。
https://stackoverflow.com/questions/10810643
复制相似问题