我们有一个Log
类,它通过StreamWriter
将日志条目写入日志文件。每次调用logItem()
时,都会传入一个条目并写入该文件。现在,在WriteLine()
方法调用之后,还会调用Flush()
。
您是否认为有必要为每次写作致电Flush()
?任何表现影响?
答案 0 :(得分:6)
显然,会对性能产生影响。真正的问题是,是否足以对性能产生影响。而且(虽然我们无法从你的问题中真正说出来)很可能没有。
这实际上取决于写入日志的行数,以及写入流的成本是多少(更快的文件系统会更便宜)。唯一可以知道的方法是在你期望它运行的条件下测试它。
是否必要来呼叫Flush()
取决于您需要日志的最新情况。如果您担心在系统崩溃时丢失数据,则需要经常调用它(特别是如果日志将用于帮助调试崩溃)。妥协可能是保持计数器并每隔4或5行左右刷新日志。
简而言之:目前,我会让每一行都清除数据。完成程序后,您可以分析代码以查看导致程序运行缓慢的原因。如果是日志,则然后担心速度更快。不是之前。
答案 1 :(得分:3)
这个问题的表现很容易测试。
Flush会对性能产生影响,但它不一定会导致内容立即写入磁盘(最大的潜在性能影响),除非您指定了FileOptions.WriteThrough,或者操作系统已经专门配置为不使用write-caching表示目标磁盘。如果未指定FileOptions.WriteThrough,则数据将被写入\缓冲到OS磁盘高速缓存(即内存),然后由OS在稍后的某个时间点(即异步)写入磁盘。
因此,尽管存在潜在的性能问题,但可以通过操作系统磁盘缓存在一定程度上缓解这些问题,缓存写入然后在稍后的某个时间点提交它们。但是,这确实会带来可靠性问题,因为如果应用程序崩溃,未提交的日志条目可能会丢失。
您需要在性能与可靠性需求之间取得平衡。
实际性能特征在很大程度上取决于您:硬件,环境\设置和日志记录行为。首先测试性能然后考虑简单的优化,如果实际存在问题,例如只考虑可靠性问题后,才能在这么多行之后冲洗。
“不要思考 - 衡量”。
答案 2 :(得分:1)
好吧,对Flush的调用正是它所说的。 Streams会为了性能而缓冲信息;通常情况下,更容易获得更大的字节数据包然后将其写入底层资源(磁盘,网络),而不是每次都执行对底层资源的写入。
调用Flush将确保将缓冲的内容写入底层资源。
如果你在每次写入后调用它,你可能会看到性能下降,因为你对我假设的磁盘做了很多小写。这样做的好处是它更具容错能力。如果出现问题,您的日志将尽可能保持最新状态。
如果您在每次写入日志后都没有调用Flush,那么您就有可能在出现故障时丢失部分信息。
现在,无论权衡取舍是否合适都取决于您,您必须始终或在其他各个时间衡量Flush的影响,以及它是否符合您的风险和绩效需要。
答案 3 :(得分:0)
修改:
这适用于非常旧版本的.net框架。见评论
它会大大降低性能 使用AutoFlush总是更好,因为它经过优化和快速,并且不需要大量代码来完成工作。
如果您不打算使用autoflush,每隔50或60行冲洗一次会给您带来更好的性能,但数量取决于线路长度(通常每次冲洗4KB都可以)
更好的方法是使用二进制协议并使用一些代码来读取它,它总是更快,没有条件。