为什么异步写入多个文件比同步慢?同步版本需要 30 秒才能完成,异步版本需要 40 秒。我认为它会更快,因为它可以并发写入文件。
void Write()
{
for (int i = 0; i < 100000; i++)
{
File.WriteAllText($"test{i}", "TEST");
}
}
async Task WriteAsync()
{
Task[] fileTasks = new Task[100000];
for (int i = 0; i < 100000; i++)
{
fileTasks[i] = File.WriteAllTextAsync($"test{i}", "TEST");
}
await Task.WhenAll(fileTasks);
}
我认为它会更快,因为它可以并发写入文件。
是的,也不是。当写入大量连续数据时,所有磁盘往往表现最佳。这种影响对于 HDD 来说最为明显,因为写入头必须进行物理移动。但它对 SSD 的影响也较小。
SSD 可以同时写入数据,因此拥有大量命令可能是一个好处,因为它允许驱动器并行执行操作。但这并不意味着您需要同时写入许多文件,将大量数据写入单个文件应该足以为驱动器保留适当的命令队列。
您的测试也有点极端,有大量非常小的文件。虽然这绝对会对随机写入的驱动器造成压力,但它也可能会以可能导致开销的方式对任务调度造成压力。它还可能导致必须同步所有请求的文件系统中的争用问题。
最终我不会期望 IO 操作在并发运行时表现更好。我可能会尝试使用一定量的并发来检查它是否对我的特定工作负载和特定硬件有好处。我无法说出您的情况的具体限制是什么,但您的结果在我的预期之内。