FileStream очень медленный при холодном запуске приложения

2

Очень похожий вопрос также был задан здесь на SO, если вы заинтересованы, но, как мы увидим, принятый ответ на этот вопрос не всегда имеет место (и это никогда не касается моего шаблона использования приложения).

Код определения производительности состоит из конструктора FileStream (для открытия файла) и хэша SHA1 (реализация каркаса .Net). Код в значительной степени является версией С# того, что было задано в вопросе, который я связал с выше.

Случай 1: Приложение запускается либо в первый раз, либо в течение N-го времени, но с другим целевым файлом. Теперь приложению предлагается вычислить значения хэша в файлах, которые ранее не были доступны.

  • ~ 50мс
  • 80% конструктор FileStream
  • 18% хэш-вычислений

Случай 2: Теперь приложение полностью завершено и снова запустилось, попросив вычислить хэш в тех же файлах:

  • ~ 8ms
  • 90% хэш-вычисление
  • 8% конструктор FileStream

Проблема
Мое приложение всегда используется Случай 1. Его никогда не попросят перекомпилировать хэш на файл, который уже был посещен один раз.

Итак, мой способ определения скорости - FileStream Constructor! Можно ли что-то сделать, чтобы ускорить этот вариант использования?

Спасибо.

P.S. Статистика была собрана с использованием профайлера JetBrains.

  • 1
    Я вижу точно такое же поведение. Использование ReadAllBytes и вычисление хэша занимает короткое время, но может быть ужасно для памяти (в зависимости от размера файла). Поэтому я попытался передать FileStream в computehash MD5 ($ stream) и увидел совершенно неприемлемые результаты. Времена результата на порядки отличаются ...
  • 1
    @ Алекс К.: Из исходного кода FileStream , что существуют тонны директив препроцессора, и даже в самых простых путях инициализация кажется довольно сложной. Возможно, вы захотите указать, с каким конкретным конструктором у вас возникли проблемы и как выглядит ваша среда, и, надеюсь, люди (намного) умнее меня могут вам помочь.
Показать ещё 4 комментария
Теги:
performance
hard-drive

2 ответа

1

Файловая система и контроллер диска будут кэшировать недавно просмотренные файлы/сектора.

Шаг определения скорости - это чтение файла, а не создание объекта FieStream, и совершенно нормально, что он будет значительно быстрее во втором запуске, когда данные находятся в кеше.

  • 0
    Я не верю, что это так. Конструктор FileStream не читает весь файл, для этого вызывается хеш-функция. Но это конструктор, который занимает 80% времени.
0

Вам следует попытаться использовать собственный FILE_FLAG_SEQUENTIAL_SCAN, вам нужно будет вывести CreateFile, чтобы получить дескриптор и передать это FileStream

  • 2
    Разве использование конструктора, который принимает FileOptions делает это в потоке, если вы передаете его FileOptions.SequentialScan ? РЕДАКТИРОВАТЬ: да, он просматривает справочный источник, в котором параметр enum превращается в dwFlagsAndAttributes CreateFile , а значение enum равно 0x08000000 что совпадает со значением FILE_FLAG_SEQUENTIAL_SCAN

Ещё вопросы

Сообщество Overcoder
Наверх
Меню