我正在用2MB块写入~280MB的数据到FileStream。
在一台机器上,这在8秒内完成。在我的机器上(具有类似规格,SSD等)我一直在尝试调试为什么它需要超过40秒并且它们在进度中暂停。
我从硬件设备返回时写入数据,但我发现有时候,在流上调用Write可能需要很长时间才能返回。我在所有写入之间调用flush:
Stopwatch stopwatch = Stopwatch.StartNew();
_stream.Write(buffer, 0, buffer.Length);
stopwatch.Stop();
Console.WriteLine("_stream.Write() " + stopwatch.ElapsedMilliseconds + "ms");
_stream.Flush();
输出:
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 2ms
... snip
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 23233ms <- not expecting this
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 0ms
... snip
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 15852ms <- or this
_stream.Write() 2ms
_stream.Write() 2ms
_stream.Write() 2ms
... snip
_stream.Write() 2ms
_stream.Write() 25ms
_stream.Write() 2ms
_stream.Write() 2ms
这不是我所期望的
答案 0 :(得分:2)
我实际上怀疑它可能是你认为应该让它快速。 SSD很可能是罪魁祸首。
所以这就是奇怪的。像.net这样的SSD有一个GC。这是因为与HDD不同的SSD不能以与写入信息相同的方式删除信息。写入的最小单位比最小的删除单位小得多。
有关更多信息,请搜索写入放大。
业界知道这一点,因此他们在SATA中开发了一项名为TRIM的功能。然而,我的研究表明,由于一些奇怪的原因,有些批次的Corsair Force 3在固件中禁用了TRIM ......
答案 1 :(得分:1)
您可以随时在异步线程上运行Write,并在写入过程完成时回调吗?