C++ 缓冲区冲洗:“\";vs.std::endl
可能重复:C++ 缓冲区冲洗:“\";vs.std::endl,c++,optimization,C++,Optimization,可能重复: 在加速C++中,有两个问题被提及: 大多数系统需要大量的时间将字符写入输出设备。正因为如此,C++积累了要写入缓冲区的字符,等待缓冲区被刷新。 刷新缓冲区的一种方法是使用std::endl显式地告诉它这样做 这让我想知道:很明显,除了最大的输出外,所有输出的好处都很小且不明显,但是使用“\n”比使用std::endl快,或者说“\n”还刷新缓冲区?使用“\n”不会刷新缓冲区,而且确实比使用std::endl更快 在典型的I/O中,输出在写入预期设备之前会被缓冲。这样,当写入到慢速访
<>在加速C++中,有两个问题被提及:
std::endl
显式地告诉它这样做这让我想知道:很明显,除了最大的输出外,所有输出的好处都很小且不明显,但是使用
“\n”
比使用std::endl
快,或者说“\n”
还刷新缓冲区?使用“\n”不会刷新缓冲区,而且确实比使用std::endl更快
在典型的I/O中,输出在写入预期设备之前会被缓冲。这样,当写入到慢速访问设备(如文件)时,它不必在每个字符之后访问设备。刷新将缓冲区“刷新”到设备上,造成一定的性能开销
-改编自:我想补充一点,我认为在流中写入
'\n'
的意义可能不同于在第三方库中写入std::endl
/std::flush
例如,我在当前项目中使用基于ostream的记录器。该记录器使用std::stringstream
功能进行输出格式化,但覆盖了用于刷新的操纵器。这允许在不刷新的情况下将'\n'
写入日志,并简化了代码
下面是一个伪代码示例:
class MyStream
{
// [cut]
std::stringstream m_buffer;
// [cut]
};
// friends:
template <typename Printable>
MyStream& operator<<(MyStream& stream, const Printable& value)
{
stream.m_buffer << value;
}
typedef decltype(std::flush) TManipulator;
template <>
MyStream& operator<<(MyStream& stream, const TManipulator& manipulator)
{
if ( manipulator == std::flush || manipulator == std::endl )
stream.sendLogLine();
else
stream.m_buffer << manipulator;
}
// usage sample
void main()
{
getLoggerStream() << "hello" << std::endl;
}
classmystream
{
//[剪辑]
std::stringstream m_缓冲区;
//[剪辑]
};
//朋友们:
模板
MyStream&Operatories,这是一个实现细节,所以您不会得到明确的答案。我的猜测是,这在大多数实现中都会有所不同,但这并不一定是真的。@Carl——诚然,我没有,我甚至不知道如何做到这一点。我当时正在读这本书,我很好奇,所以我想我应该问一下。对于一些[通常]非常小的“更快”值——)@pst:嗯,当输出大量数据到文件时,它实际上可能会扼杀性能(有一次我在CSV中写入数十MBs的数据时遇到过这种情况)。@MatteoItalia True,我没有想到相反的情况:(@MatteoItalia:另一方面,iostream不是最快的输出方式,因此会有许多其他东西对性能产生负面影响。@SigTerm:iostreams的设计很糟糕,但在g++
实现中,我发现它比C stdio稍快一些。