File.Copy vs Stream.CopyToAsync

331
18 июня 2017, 14:57

Подскажите пожалуйста, что более правильно использовать для копирования файла в полностью асинхронной службе WCF?

System.IO.File.Copy(sourceFileName: full_path_temp_file, destFileName: 
full_path_file);

или

await stream.CopyToAsync(destination: file_stream);

Я смотрел код на https://referencesource.microsoft.com для обоих методов, File.Copy реализован через вызов WinAPI т.е. полностью неуправляемый код в отличии от Stream.CopyToAsync, но к сожалению File.Copy не асинхронный, т.е. он заблокирует такой важный для WCF ресурс как поток, и в целом это может отрицательно сказаться на производительности службы.

Answer 1

(Вынесено из обсуждения в комментариях.)

CopyToAsync — более общая функция, т. к. она работает с произвольными потоками. Поэтому она теоретически может быть медленнее, менее оптимальной, чем прямой вызов File.Copy (например, за счёт другого выбора размеров буфера).

Тем не менее обычно разница незначительна, т. к. операции с файловой системой обычно существенно медленнее операций с потоками и переключениями контекста. А значит, время на обращение и отклик файловой системы должно доминировать в общем времени исполнения функции копирования.

Я бы посоветовал провести профилирование обоих вызовов на типичных для вашего приложения размерах файлов и нагрузках на файловую систему. (Мы, к сожалению, не знаем, какие типичные данные для вашей системы, поэтому наши тесты могут показать не такую производительность, как у вас.) [Только во время профилирования не копируйте один и тот же файл много раз подряд, иначе он окажется в кеше ОС, и результаты профилирования будут неправильными.]

Я бы поставил на то, что обе функции покажут примерно одинаковое время, и в этом случае асинхронный вариант однозначно лучше. Если вдруг окажется, что асинхронный вариант реально на ваших данных намного медленнее, лишь тогда имеет смысл думать о том, что важнее для вашей программы — не занимать лишний поток или копировать скорее. (А для этого, наверное, нужно снова профилирование — при каком из вариантов мы обслужим больше клиентов за единицу времени?)

READ ALSO
Транслятор с С# кода в код ассемблера х86 [требует правки]

Транслятор с С# кода в код ассемблера х86 [требует правки]

В универе поставили задачу написать транслятор с С# языка на язык ассемблера(x86)Честно говоря ниразу в жизни даже не трогал ассемблер, а уже...

243
Поиск по стороннему сайту на C#

Поиск по стороннему сайту на C#

Реально ли организовать поиск по стороннему, не своему, сайту по ключевым словам? Нужно искать соответствующие страницы, дальнейший парсинг...

229
Распарсить XML-файл с помощью c#

Распарсить XML-файл с помощью c#

ЗдравствуйтеУ меня в проекте ASP

345
C# string.Compare

C# string.Compare

при сравнении данным методом "а" строковой и "В", будет ли метод использовать код символов в юникод? У а – 97, у В – 66Значит если сравнить их без...

221