Как Сехе говорит, что это отчасти потому, что буферизация, но это еще не все, и я объясню, почему это так и в то же время, почему fgetc()
даст больше задержки.
fgetc()
вызывается для каждого байта, считываемого из файла.
fread()
вызывается для каждых n байтов локального буфера для данных файла.
Итак, для файла 10 МБ:
fgetc()
называется: 10 485 760 раз
При fread
с буфером 1 КБ функция вызывается 10 240 раз.
Для простоты скажем, что каждый вызов функции занимает 1 мс:
fgetc
займет 10 485 760 мс = 10485,76 секунд ~ 2 9127 часов
fread
займет 10 240 мс = 10,24 с
Кроме того, ОС обычно выполняет чтение и запись на одном и том же устройстве, я полагаю, что ваш пример делает это на одном жестком диске. ОС при чтении исходного файла перемещает головки жесткого диска по дискам вращающегося диска в поисках файла, затем читает 1 байт, помещает его в память, затем снова перемещает головку чтения / записи по вращающимся дискам жесткого диска, глядя на место что ОС и контроллер жесткого диска согласились определить местонахождение файла назначения и затем записывают 1 байт из памяти. В приведенном выше примере это происходит более 10 миллионов раз для каждого файла: в общей сложности более 20 миллионов раз, при использовании буферизованной версии это всего лишь более 20 000 раз.
Помимо того, что ОС при чтении с диска помещает в память еще несколько КБ данных на жестком диске для повышения производительности, это может ускорить работу программы даже при использовании менее эффективного fgetc
, поскольку программа считывает данные из памяти ОС. вместо того, чтобы читать прямо с жесткого диска. Это то, к чему относится ответ Сихе.
В зависимости от конфигурации вашего компьютера / загрузки / ОС / и т. Д. Ваши результаты чтения и записи могут сильно различаться, поэтому он рекомендует очищать дисковые кеши для лучшего восприятия более значимых результатов.
Когда исходные и конечные файлы находятся на разных жестких дисках, все происходит намного быстрее. С SDD я не совсем уверен, что чтение / запись абсолютно исключают друг друга.
Резюме: Каждый вызов функции имеет определенные издержки, чтение с жесткого диска имеет другие издержки, а кеширование / буферы помогают ускорить процесс.
Другая информация
http://en.wikipedia.org/wiki/Disk_read-and-write_head
http://en.wikipedia.org/wiki/Hard_disk#Components