Кто бы ни сказал вам использовать mmap
, он не очень много знает о современных машинах.
Преимущества mmap
в производительности - это полный миф.В словах Линуса Торвальдса :
Да, память "медленная", но, черт возьми, так же, как и mmap ().
Проблемаmmap
означает, что каждый раз, когда вы впервые касаетесь страницы в отображаемой области, она попадает в ядро и фактически отображает страницу в ваше адресное пространство, разрушая TLB.
Попробуйтепростой бенчмарк, считывающий большой файл 8K за раз, используя read
, а затем снова с mmap
.(Используя один и тот же буфер 8 КБ снова и снова.) Вы почти наверняка обнаружите, что read
на самом деле быстрее .
Ваша проблема никогда не заключалась в извлечении данных из ядра;это было с тем, как вы обрабатываете данные после этого.Минимизируйте работу, которую вы делаете персонажем за один раз;просто отсканируйте, чтобы найти новую строку, а затем выполните одну операцию с блоком.Лично я бы вернулся к реализации read
, используя (и повторно используя) буфер, который помещается в кэш L1 (8K или около того).
Или, по крайней мере, я бы попробовал простой *Тест 1026 * против mmap
, чтобы увидеть, что на вашей платформе действительно быстрее.
[Обновление]
Я нашел еще пару комплектов комментариев от мистера Торвальдса:
http://lkml.iu.edu/hypermail/linux/kernel/0004.0/0728.html http://lkml.iu.edu/hypermail/linux/kernel/0004.0/0775.html
Краткое содержание:
И, кроме того, у вас все еще есть фактические затраты на пропуск TLB процессора и т. Д. Чего часто можно избежатьесли вы просто перечитываете в ту же область вместо того, чтобы быть чрезмерно умным с управлением памятью, чтобы избежать копирования.
memcpy () (т.е. в данном случае «read ()») - всегда во многих случаях будет быстрее, просто потому, что избегает всех дополнительных сложностей.Хотя в других случаях mmap () будет работать быстрее.
По моему опыту, чтение и обработка большого файла последовательно является одним из "многих случаев", когда использование (и повторное использование) aбуфер небольшого размера с read
/ write
работает значительно лучше, чем mmap
.