更新

更新

我有一些测试代码,它生成 5000 个小数据块的列表(最小大小:351 字节,最大大小:386 字节,平均大小:385 字节),然后将它们作为单独的文件写入目录 - 每个文件的平均写入时间约为 5 毫秒

如果我使用完全相同的代码,但不是写入 5000 个不同的块,而是一遍又一遍地重复相同的数据(例如,将前 10 个块写入 500 次),则平均写入时间将达到每个文件少于 2 毫秒 - 就好像文件系统能够以某种方式优化写入,因为数据是相同的。

有人可以解释这种行为吗?

在配备 8 GB RAM 的 Surface Pro 4 - i5 处理器上进行测试,写入内置固态硬盘。操作系统是 Windows 10。

测试代码:

const int count = 5_000;

// Generate a list of count small byte arrays: min. size: 351, max size: 386, average size: 385
var bytes = SerializeObjects( count );
// Write them all to disk as individual files
var watch = Stopwatch.StartNew();
for ( var i = 0; i < count; i++ )
{
    File.WriteAllBytes(
        Path.Combine( _directory, Guid.NewGuid() + ".xml" ),
        bytes[ i ]
    );
}
watch.Stop();
// Timed at: around 5ms per file
Console.WriteLine( "Wrote {0:n0} files in {1:n0} ms ({2:n3} ms per file)", count, watch.ElapsedMilliseconds, (double)watch.ElapsedMilliseconds / count );

修改WriteAllBytes()写入调用bytes[ i % 10 ](因此一遍又一遍地重复前 10 个值)每个文件的时间下降到少于 2 毫秒

更新

它不是重复数据删除:

PS > Get-DedupProperties C
Get-DedupProperties : Deduplication feature is not available

答案1

Windows Server 2012 以后的版本支持数据“重复数据删除”。您的系统可能启用了此功能,如果启用了此功能,则操作系统会检测重复写入并分配指向公共文件系统数据的“指针”。这样做的效果是 NT 只会更新目录块,而不必为重复文件分配和写入新的文件系统块,从而显著减少 I/O。

相关内容