Как у меня возникла идея попробовать написать свою программку копирования? Из наблюдения за процессом копирования менеджеров файлов, в первую очередь Total Commander и Far. Особенно у Total Commander это заметно в режиме копирования файлов в очереди.
Когда копирования очередного файла в очереди завершено, то есть файл полностью скопирован, программа замирает на продолжительное время (при копировании файла большого размера). Поразмыслив, я пришел к выводу, что причина в том, что запись файла кэширована, и при закрытии только что скопированного файла операционная система не отдает управление программе копирования, пока не будет полностью сброшен кэш записи на диск.
Но в этом момент работает только диск назначения (если диски источника и назначения различны). Поэтому почему бы не начать заранее считывать следующий файл в буфер, пока текущий сбрасывает кэш на диск?
Собственно, на этой идеи и была основана моя многопоточная программка. И к моему разочарованию, она не показала особого ускорения по сравнению со стандартными способами: хоть при использовании xcopy, хоть Total Commander.
Я пробовал копировать со одного HDD на другой, с USB HDD на встроенный HDD и с HDD на сетевой диск. Результат был плюс-минус одинаковым.
А потом я решил ее проверить на более новом компе. И вот тут все сработало как надо: ускорение при копировании по сравнению с copy 29% с диска f: на диск g:, и 32% в обратном направлении.
Собственно, замерил в двух направлениях только из-за того, что это были два почти одинаковых HDD Seagate, отличия только в буковках названия модели, при этом один из диском, судя по мониторингу, был существенно меньше загружен, чем другой (f: > g:).
С чем же связано такое различие в поведении программы при исполнении на двух разных компьютерах? У меня несколько предположений.
1. Необходимым условием для ускорения копирования таким методом является возможность работы различных устройств хранения данных параллельно друг с другом. Если это условие не выполняется, то ускорения не будет.
Поэтому мне кажется это основной причиной различия в результатах.
Тем более, что когда я в прошлый раз менял сгоревшую "мать" (к сожалению, вместе с процессором), то заметил существенное снижение производительности дисковой подсистемы. Но так как на старой материнке я не тестил скорость дисковых операций, то всё осталось на уровне ощущений. Старая материнка была средне-высокой ценовой категории, а текущая – из дешевых.
Судя по тестам, мне кажется, что моя текущая плата не умеет вообще в параллельный ввод-вывод.
2. На компьютерах стоят разные операционные системы: Windows 7 на моем рабочем и Window 10 на более новом и быстром.
3. Я сравнивал быстродействие моей программы и стандартной copy. Возможно, xcopy будет работать быстрее. Проверю при ближайшей возможности.
Из любопытного: старый комп, которому уже наверное больше пяти лет, показал скорость копирования HDD–HDD около 30 МиБ/с, а вот новый – около 180. Я думал, что в области жестких дисков уже давно нет никакого прогресса в скорости работы, только емкость потихоньку растет. Но, похоже, это не так?
Впрочем, на старом компе оба диска достаточно сильно забиты данными, так что, возможно, разница объясняется сильной фрагментацией данных.
Не знаю, надо ли кому, но выложил программку в общий доступ. Интерфейс у нее несколько кривоват и неудобен, а также несколько слеповат. Может быть, когда-нибудь и сделаю получше.