Я создал приложение WPF, которое считывает физическое устройство (жесткий диск, USB-накопитель) в файл. Я получаю скорость до 75-80 МБ / с для HD и 20-25 для USB. Я хотел добавить MD5 и SHA1 хэширование изображения на лету. Обычно я считываю блок из 128 секторов (64 КБ) с диска, хеширую его с помощью двух алгоритмов, а затем записываю блок в другой файл.
Что ж, две функции хеширования кажутся огромным узким местом. Скорость снизилась до 5 Мбит / с для USB и 20 Мбит / с для HD.
Итак, я попытался поместить код хэширования в другой поток. Таким образом, один поток читает блоки и помещает значение в список FIFO (созданный с использованием List). Затем другой поток выскакивает блок и использует его.
Проблема в том, что чтение потока с диска происходит быстрее, чем хэширование, и список будет расти в геометрической прогрессии. Поэтому я поставил ограничение в списке из 1024 блоков. Когда первый поток видит, что в списке 1024 блока или более, он спит, пока не достигнет 512 ...
Кажется, это работает в течение первых нескольких секунд. Я получаю 19 Мбит / с для USB. Но через некоторое время он снова начинает замедляться. Я полагаю, он заполнил список и ждет, пока у него будет свободное место ...
Может быть, у меня медленные функции? Я скопировал первое, что я нашел в Интернете ...
Как я могу повысить скорость моего приложения?
Спасибо