我做了一个测试,看看在磁盘上从单字节数组写入 1GB 文件和从 1024 个数组(每个 1MB)写入另一个 1GB 文件所需的时间是否存在差异。
测试写入多个数组
331.6902 ms
测试写入大数组
14756.7559 ms
对于这个测试,“许多数组”实际上是一个单独的byte[1024 * 1024]
数组,我使用 for 循环写了 1024 次。“大数组”只是一个填充了随机值的 1GB 字节数组。
这是代码的样子:
Console.WriteLine("Test Writing many arrays");
byte[] data = new byte[1048576];
for (int i = 0; i < 1048576; i++)
data[i] = (byte)(i % 255);
FileStream file = new FileStream("test.txt", FileMode.Create);
sw1.Restart();
for (int i = 0; i < 1024; i++ )
file.Write(data, 0, 1048576);
file.Close();
sw1.Stop();
s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
Console.WriteLine("Test Writing big array");
byte[] data2 = new byte[1073741824];
for (int i = 0; i < 1073741824; i++)
data2[i] = (byte)(i % 255);
FileStream file2 = new FileStream("test2.txt", FileMode.Create);
sw1.Restart();
file2.Write(data2, 0, 1073741824);
file2.Close();
sw1.Stop();
s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
我包括了file.Close()
定时部分,因为它调用Flush()
方法并将流写入磁盘。
生成的文件大小完全相同。
我认为也许 C# 可以看到我总是使用相同的数组,它可能会优化迭代/写入过程,但结果不是快 2-3 倍,而是快了大约 45 倍......为什么?