BinaryReader第一次运行后快30倍.字节数组仍在内存中

本文关键字:数组 内存 字节数 字节 运行 第一次 30倍 BinaryReader | 更新日期: 2023-09-27 18:14:58

我的程序从一个文件中读取x个字节,检查它们是否都是零,对20,000个文件重复这个过程,并保留一个包含非零字节的文件列表。为了监控性能,我将每个文件检查的字节数设置为可定义的(byteSize)。

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

BinaryReader在"using"指令下,因此据我所知,它应该在循环完成后关闭流。那么为什么字节数组仍然存在呢?我如何删除它?我需要在每次运行程序时测量实际性能。

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; 
}

BinaryReader第一次运行后快30倍.字节数组仍在内存中

这几乎肯定与。net正在做的任何事情都没有关系——它将是文件系统为您透明地缓存。

要测试这一点,将代码更改为仅使用FileStream并简单地遍历文件,将其读入缓冲区并忽略数据:

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

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