FileStream загружается в .NET? - PullRequest
       30

FileStream загружается в .NET?

2 голосов
/ 18 сентября 2008

У меня есть вопрос об использовании потоков в .NET для загрузки файлов с диска. Я пытаюсь определить проблему с производительностью и хочу быть уверен, что это именно то, что мне кажется.

Dim provider1 As New MD5CryptoServiceProvider
Dim stream1 As FileStream

stream1 = New FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)
provider1.ComputeHash(stream1)

В: Читаются ли байты с диска, когда я создаю объект FileStream или когда объект, потребляющий поток, в данном случае алгоритм хеширования MD5 фактически читает его?

Я вижу значительные проблемы с производительностью на моем веб-хосте при использовании метода ComputeHash по сравнению с моей локальной тестовой средой. Я просто пытаюсь убедиться, что проблема с производительностью связана с хэшированием, а не с доступом к диску.

Ответы [ 3 ]

2 голосов
/ 18 сентября 2008

FileStream просто представляет IO.Stream вокруг объекта файла и использует буферы. Он не читает весь файл в конструкторе (файл может быть больше, чем RAM).

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

Но одна из первых вещей, которые вы можете попробовать:

provider1.ComputeHash(stream1.ToArray());

Это должно заставить FileStream прочитать весь файл и вернуть массив байтов. .ToArray () может вызывать более быстрый метод, чем метод .Read (), который будет вызывать ComputeHash.

0 голосов
/ 18 сентября 2008

Байты с диска должны быть прочитаны, когда вызывающая сторона запрашивает их, вызывая Read или аналогичные методы. В любом случае, и жесткий диск, и операционная система выполняют некоторые операции чтения, чтобы улучшить операции последовательного чтения, но это, безусловно, трудно предсказать.

Вы также можете попробовать поиграть с параметром размера буфера, который некоторые перегрузки конструктора предоставляют для FileStream.

0 голосов
/ 18 сентября 2008

Да, содержимое файла будет прочитано, тогда вы запускаете метод ComputeHash, а не когда вы просто открываете FileStream.

Лучший способ проверить, где проблема с производительностью, - это прочитать данные из файла в поток хэширования и измерить производительность каждого из этих шагов. Для этого вы можете использовать класс System.Diagnostics.Stopwatch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...