Я вижу один потенциальный способ ускорить этот процесс: вычислить MD5 исходного файла при выполнении копирования , а не до этого.Это уменьшит количество раз, которое вам потребуется для чтения всего файла, с 3 (исходный хеш, копия, целевой хеш) до 2 (копия, целевой хеш).
Недостатком всего этого является то, что выВам придется написать свой собственный код для копирования (в отличие от простого использования System.IO.File.Copy), и существует ненулевая вероятность того, что в конечном итоге это окажется медленнее, чем трехэтапный процесс.
Кроме этого, я не думаю, что здесь можно многое сделать, поскольку весь процесс связан с вводом / выводом в соответствии с дизайном.Вы тратите большую часть своего времени на чтение / запись файла, и даже при скорости 100 МБ / с (приличная скорость ввода-вывода для вашего типичного диска SATA) вы в лучшем случае получите около 5,8 ГБ / мин.
С современным процессором затраты на вычисление MD5 (или чего-либо еще) не сильно влияют на результат, поэтому его ускорение не улучшит общую пропускную способность.Криптоускорители, в частности, здесь вам не помогут, поскольку, если реализация драйвера не очень эффективна, они добавят больше накладных расходов из-за переключателей контекста, необходимых для подачи данных на внешнюю карту, чем они сохранят.
Что вы хотите улучшить, так это скорость ввода / вывода.Платформа .NET уже довольно эффективна, когда дело доходит до этого (с использованием буферов хорошего размера, перекрывающихся операций ввода-вывода и т. Д.), Но возможно, что оптимизированное собственное приложение Windows будет работать лучше здесь.Мой совет: Найдите в Google несколько собственных калькуляторов MD5 и посмотрите, как они соотносятся с вашей текущей реализацией .NET.Если разница в скорости вычисления хеша составляет> 10%, стоит перейти к использованию указанного внешнего приложения.