我做了一个测试,看看从单个字节数组写入磁盘上的 1GB 文件和从 1024 个数组(每个 1MB)写入另一个 1GB 文件所花费的时间是否存在差异。
Test Writing many arrays
331.6902 ms
Test Writing big array
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 倍。 .. 为什么?
最佳答案
我认为造成巨大差异的主要原因是操作系统设法缓存几乎整个 1GB 的小块写入。
您需要更改基准测试的设置方式:代码应写入相同的数据,第一次写入 1024 个 block ,第二次写入一个 block 。您还需要通过指定 FileOptions.WriteThrough
关闭操作系统中的数据缓存,如下所示:
var sw1 = new Stopwatch();
Console.WriteLine("Test Writing many arrays");
var data = new byte[1073741824];
for (var i = 0; i < 1073741824; i++)
data[i] = (byte)(i % 255);
var file = new FileStream("c:\\temp\\__test1.txt", FileMode.Create, FileSystemRights.WriteData, FileShare.None, 8, FileOptions.WriteThrough);
sw1.Restart();
for (int i = 0; i < 1024; i++)
file.Write(data, i*1024, 1048576);
file.Close();
sw1.Stop();
var s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
Console.WriteLine("Test Writing big array");
var file2 = new FileStream("c:\\temp\\__test2.txt", FileMode.Create, FileSystemRights.WriteData, FileShare.None, 8, FileOptions.WriteThrough);
sw1.Restart();
file2.Write(data, 0, 1073741824);
file2.Close();
sw1.Stop();
s1 = sw1.Elapsed;
Console.WriteLine(s1.TotalMilliseconds);
当您运行这段代码时,结果如下所示:
Test Writing many arrays
5234.5885
Test Writing big array
5032.3626
关于c# - 为什么将许多小字节数组写入文件比写入一个大数组更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435502/