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 syscall два пъти. (веднъж, за да получите стария 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