BinaryReader в 30 раз быстрее после первого запуска. Байтовый массив все еще в памяти?

Моя программа считывает 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; 
}

person Emanuele Vissani    schedule 26.10.2016    source источник
comment
Ваше приложение не может восстановить массив байтов таким образом после перезапуска процесса. Возможно, вы столкнулись с кэшированием файлов операционной системой.   -  person itsme86    schedule 26.10.2016
comment
массив не остается в памяти (он не сохраняется после перезапуска процесса), но сохраняется содержимое файла. Для таких вещей в Windows есть собственный кеш файловой системы. Создание новых файлов для каждого запуска должно решить эту проблему.   -  person Jeroen Mostert    schedule 26.10.2016


Ответы (1)


Это почти наверняка не имеет ничего общего с тем, что делает .NET - это будет файловая система, прозрачно кэширующая для вас.

Чтобы проверить это, измените свой код, чтобы он просто использовал FileStream и просто перебирал файл, читая его в буфер и игнорируя данные:

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

Я уверен, что вы увидите тот же результат - первое чтение будет относительно медленным, затем очень быстрым.

person Jon Skeet    schedule 26.10.2016
comment
Подтверждено другим способом: я использовал RAMMap от SysInternal для очистки кеша ОС. и скорость возвращается к первому запуску. stackoverflow.com/questions/478340 / - person Emanuele Vissani; 26.10.2016