stringstream可以多长时间?

时间:2018-05-09 10:18:23

标签: c++ visual-studio c++11 logging

使用Visual Studio C ++ 11中的大项目。

为了避免延迟,我试图将函数的日志(可能是巨大的,并且可以超出300000+以上的日志行,因为函数进行了一些大量的计算)到std :: stringstream并最终将其刷新为文件。

我想做什么坏事?有什么我可以做得更好吗?这是因为每次我想写日志时我都不想将它刷新到文件中。

蒂亚!

2 个答案:

答案 0 :(得分:3)

最终,这里的约束只是程序的免费存储空间量,这实际上是系统上的备用内存量(RAM,交换,等等)。

随着“内容”的增长,stringstream的性能会有所下降,因为调整缓冲区大小需要复制其内容,而当内容更多时,这会慢一些。您还可能会破坏系统内存池的碎片。很难从你的描述中知道这是否是一个因素(这里的行数并不重要; bytes 的数量是)。

根据日志填满的速度,我会考虑更频繁地刷新文件,以便:

  • 每次执行此操作本身相对较快,
  • 您使用操作系统自己非常聪明的缓冲算法,
  • 你利用了硬盘自己非常聪明的缓冲算法
因为故意避免使用所有成熟技术没有多大意义。

从根本上说,分批冲洗是有道理的,所以你的整体设计听起来还不错。

答案 1 :(得分:1)

std::stringstreamstd::string的包装,因此限制为std::string::max_size(),这取决于系统/实现。

我会更频繁地尝试刷新(不一定每次都想写一行),只有在分析显示重大损失时才进行优化。

还要记住,日志的目的通常是提供有用的调试信息。如果您的程序崩溃并且没有任何内容被刷新,那么它什么也得不到。在每一行之后冲洗和从不这样做之间应该进行权衡。