mmap против sbrk, сравнение производительности

Какой из этих вызовов в среднем быстрее? Я слышал, что mmap быстрее для небольших распределений, но я не слышал сравнения ни того, ни другого. Любая информация о производительности для них была бы хорошей.


person Jesus Ramos    schedule 01.04.2011    source источник
comment
Вы в курсе, что они делают похожие, но разные вещи?   -  person DarkDust    schedule 01.04.2011
comment
Да. Я просто хотел знать, приведет ли замена одного на другое в приемлемых обстоятельствах к разнице в производительности.   -  person Jesus Ramos    schedule 01.04.2011
comment
Ваш пробег может отличаться. Лучше всего измерять конкретное окружение, о котором вы заботитесь.   -  person bmargulies    schedule 01.04.2011
comment
Примечание: если вы вызовете sbrk, вы рискуете сломать большинство реализаций malloc. Это имеет последствия. Например, общие вызовы библиотеки C [например, strdup()] могут быть затронуты, поскольку они используют malloc().   -  person jim mcnamara    schedule 01.04.2011
comment
Действительно, вы определенно не можете использовать sbrk (или, что еще хуже, brk) в программе, которая может вызывать malloc. И поскольку любая стандартная библиотечная функция может вызывать malloc, это означает, что вы не можете использовать стандартную библиотеку, и точка.   -  person R.. GitHub STOP HELPING ICE    schedule 01.04.2011
comment
Я писал распределитель памяти, так что это не проблема, так как мой распределитель будет связан вместо malloc. Мне просто было интересно узнать о производительности, поскольку она будет использоваться внутри для определенных конкретных целей.   -  person Jesus Ramos    schedule 01.04.2011


Ответы (1)


Вы должны пометить это конкретной реализацией (например, linux), поскольку ответ, безусловно, зависит от реализации. Сейчас я предполагаю Linux, так как он самый популярный.

С учетом сказанного, brk теоретически более оптимизирован, и на практике он работает примерно на 10% быстрее на моей машине. Выделяя одну страницу, я получаю:

  • brk: мин. 2550 циклов, тип. 2650 циклов
  • mmap: минимум 2700 циклов, обычно 2800 циклов

Я помню, что слышал что-то вроде того, что brk может пропустить блокировку семафора mmap, что объясняет несоответствие.

Примечание. Я обновил это время после настройки своего теста, чтобы сделать фиктивные вызовы до определения времени, чтобы гарантировать, что весь код будет в кеше.

person R.. GitHub STOP HELPING ICE    schedule 01.04.2011
comment
как ни странно для меня, mmap на самом деле работал быстрее, чем sbrk, но опять же, с sbrk можно сохранить непрерывную память. - person Jesus Ramos; 04.04.2011
comment
Возможно, sbrk вашей системы выполняет некоторую блокировку пользовательского пространства или учет, или даже дважды вызывает системный вызов brk. (один раз, чтобы получить старый brk, и еще раз, чтобы установить новый...?) Если вы реализуете malloc, я бы не стал полагаться на системную библиотеку sbrk, а сделал системный вызов brk самостоятельно. - person R.. GitHub STOP HELPING ICE; 04.04.2011
comment
В итоге я использовал mmap в качестве основного способа захвата памяти из системы и использовал sbrk в качестве резервной копии на случай, если я получу MAP_FAILED. Вместо этого я мог бы попробовать использовать вызов brk, чтобы посмотреть, какова будет производительность. - person Jesus Ramos; 04.04.2011