Это действительно зависит от того, что вы пытаетесь сделать. Если все, что вам нужно сделать, это перейти к известному смещению и прочитать маленький тег, read()
может быть быстрее (mmap()
должен сделать довольно сложный внутренний учет). Однако, если вы планируете скопировать все 200 МБ MP3 или отсканировать его на наличие какого-либо тега, который может появиться с неизвестным смещением, то mmap()
, вероятно, более быстрый подход.
Например, если вам нужно сдвинуть весь файл на несколько сотен байтов, чтобы вставить тег ID3, одним из простых подходов было бы расширить файл с помощью ftruncate()
, отобразить файл, а затем memmove()
Содержание немного вниз. Это, однако, уничтожит файл, если ваша программа потерпит крах во время работы. Вы также можете скопировать содержимое файла в новый файл - это еще одно место, где действительно работает mmap (); Вы можете просто mmap()
старый файл, а затем скопировать все его данные в новый файл одним write()
.
Короче говоря, mmap()
замечательно, если вы выполняете большое количество операций ввода-вывода с точки зрения общего количества переданных байтов; Это связано с тем, что это уменьшает количество необходимых копий и может значительно уменьшить количество записей ядра, необходимых для чтения кэшированных данных. Однако для mmap()
требуется как минимум две поездки в ядро (три, если вы очистите отображение, когда закончите!), И выполняет некоторые сложные внутренние учеты в ядре, поэтому фиксированные накладные расходы могут быть высокими.
read()
, с другой стороны, включает в себя дополнительное копирование из памяти в память и, таким образом, может быть неэффективным для больших операций ввода-вывода, но является простым, и поэтому фиксированные накладные расходы являются относительно низкими. Короче говоря, используйте mmap()
для больших объемных операций ввода-вывода и read()
или pread()
для одноразовых небольших операций ввода-вывода.