c# - 为什么将许多小字节数组写入文件比写入一个大数组更快?

标签 c# arrays performance io

我做了一个测试,看看从单个字节数组写入磁盘上的 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/

相关文章:

c# - 使用 C# 的 GRPC 和来自服务器的流式响应导致错误 : 'Shutdown has already been called'

c# - MVC 路由问题如何设置所有 Controller 的默认操作?

python - 计算每个numpy数组列中的唯一值

javascript - 数组调整大小性能、设置长度属性与重复推送

centos - centos sendmail运行缓慢

c# - 将 UV 映射到凸起的三角形带

c# - 调用父窗体函数?

java - 不允许在 Java 中创建泛型数组

c - 如何更改函数中的 int 数组

java - 使用公共(public)静态字段,良好的编程习惯/快速?