我正在将数据定期保存到文件中(每次打开和关闭文件),我想使用Stopwatch
来测量文件操作所花费的时间。关闭流阻塞线程吗?
我是否应该纳入Close()
所需的测量时间?
我们有软件的问题,我怀疑文件操作,例如,繁忙的硬盘或某种可能导致延迟的故障。在这种情况下,调用Close()
会导致延迟(阻塞)还是Close()
一种非阻塞方法(但是在框架/ winapi文件内部的深处将从写入缓冲区等刷新到其后)?
或者可能Write()
在失败的情况下会变慢?我不知道如何模拟磁盘问题来快速测试会发生什么。
要么关闭文件的时间太短而不重要,要么不是。你打算如何在没有测量的情况下找出哪些是真的? –
您无法获得有意义的测量结果。您从不直接写入磁盘,而是写入文件系统缓存。内存到内存的拷贝速度非常快。在你关闭文件很久以后,它会被懒惰地写入磁盘。这*可能会出错,发生在文件系统缓存满容量时。无论是因为写的太多还是因为其他程序的原因,或者是因为计算机没有足够的内存或磁盘太慢或碎片太多。您的写入()将被阻止,直到空间释放,这可能需要一段时间。非常随机,很难预测。 –
一旦我将记录器配置为每次写入消息时都会打开/关闭文件,并且显示出一个非常奇怪的问题:在这种情况下,写入消息的时间与日志文件大小成比例增长。偶尔写一条消息需要0.3秒。保持FileStream立即打开,性能大大提高(写入消息的时间变得不变,而不取决于文件大小)。所以我怀疑文件上的打开/关闭操作是默认同步的(我听说.NET 5有异步类似物)。所以如果你知道你需要这个文件并且经常写,我建议试着保持它打开。 –