【发布时间】:2012-07-11 05:44:28
【问题描述】:
我做了一个测试,看看在磁盘上从单字节数组写入 1GB 文件所需的时间与从 1024 个数组(每个 1MB)写入另一个 1GB 文件所需的时间是否存在差异。
测试写入多个数组
331.6902 毫秒
测试写大数组
14756.7559 毫秒
对于这个测试,“许多数组”实际上是一个 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 in ram),导致硬盘驱动器从虚拟内存交换。
-
另一件事是缓存命中/未命中:1MB 内存的缓存命中率始终保持不变。不过,这比页面交换问题要小。
-
这也不是一个公平的比较,是吗?你不会关闭小数组 1000 次,只有一次。
-
您可能需要添加另一个测试,在其中使用 1024 次写入操作和正确的偏移量/长度写入大数组。
-
@C.Evenhuis 这就是我所做的;将偏移量设置为 0 将开始写入当前流所在的位置,即文件末尾,因为我没有寻找也没有关闭 FileStream。
标签: c# arrays performance io