2016-10-26 11 views
0

Моя программа считывает x байтов из файла, проверяет, все ли они нули, повторяет процесс для 20 000 файлов и сохраняет список файлов с ненулевыми байтами. Пытаясь контролировать производительность, я сделал количество байтов, которые он проверяет для каждого определяемого файла (byteSize).BinaryReader 30x быстрее после первого запуска. Байт-массив все еще в памяти?

Проблема в том, что для первого запуска программы требуется ~ 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; 
} 
+1

Байт-массив не может быть восстановлен таким образом вашим приложением после перезапуска процесса. Возможно, то, что вы испытываете, - это кэширование файлов операционной системы. – itsme86

+1

* array * не сохраняется в памяти (это не перезапускает процесс перезагрузки), но содержимое * файла *. Для таких вещей у Windows есть свой кэш файловой системы. Создание новых файлов для каждого запуска должно решить это. –

ответ

4

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

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

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

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

+1

Подтверждено по-другому: я использовал SysInternal [RAMMap] (http://technet.microsoft.com/en-us/sysinternals/ff700229.aspx), чтобы очистить кэш ОС, и скорость возвращается к первому запуску. http://stackoverflow.com/questions/478340/clear-file-cache-to-repeat-performance-testing –