BinaryReader首次运行后速度提高30倍。字节数组仍在内存中?

时间:2016-10-26 14:48:04

标签: c# memory binaryreader

我的程序从文件读取x个字节,检查它们是否全部为零,重复20.000个文件的进程,并保留具有非零字节的文件列表。 为了监控性能,我确定了每个文件可定义的字节数(byteSize)。

问题是程序的第一次运行需要大约5分钟才能完成(byteSize = 8192),但是如果我再次运行它只需要10秒,即使我关闭并重启程序,所以我想到的唯一原因是字节数组保留在内存中。

BinaryReader位于"使用"指令,所以据我所知它应该在循环完成后关闭流。那么为什么字节数组仍然存在?我该如何删除它?每次运行prog时,我都需要这样做来测量实际性能。

byte[] readByte = new byte[byteSize];

for (int i = 0; i < readCycles; i++)
{
    using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open, FileAccess.Read)))
    {
        reader.BaseStream.Seek(8192 + i * byteSize, SeekOrigin.Begin);
        reader.Read(readByte, 0, byteSize);
    }

    foreach (byte b in readByte)
    {
        if (b != 0)
        {
            allZeros = false;
            break;
        }
        else
            allZeros = true;
    }

    if (allZeros == false) break; 
}

1 个答案:

答案 0 :(得分:4)

这几乎肯定与.NET正在做的任何事情无关 - 它将成为透明地为您缓存的文件系统。

要对此进行测试,请将代码更改为仅使用FileStream,然后只需将文件循环读取到缓冲区并忽略数据:

using (var stream = File.OpenRead(...))
{
    var buffer = new byte[16384];
    while (stream.Read(buffer, 0, buffer.Length) > 0)
    {
    }
}

我确定你会看到相同的结果 - 第一次读取会相对较慢,然后它会非常快。