Действительно ли g_slice быстрее, чем malloc? - PullRequest
3 голосов
/ 04 июля 2011

Документы GLib рекомендуют использовать GLib Slice Allocator вместо malloc:

"Для вновь написанного кода рекомендуется использовать новый API g_slice вместо g_malloc () и друзей, еслиразмеры объектов не изменяются в течение их времени жизни, а размер объекта, используемый во время выделения, все еще доступен при освобождении. "- http://developer.gnome.org/glib/unstable/glib-Memory-Slices.html

Но на практике g_slice значительно быстрее, чем malloc для Windows / Linux (достаточно быстрым, чтобы оправдать дополнительные проблемы с обработкой размеров и хаков препроцессора GLib, таких как g_slice_new)?Я планирую использовать GLib в моей программе C ++ для обработки конфигурации INIish (GKeyFile) и для получения доступа к структурам данных, недоступным в C ++, таким как GHashTable, поэтому зависимость GLib в любом случае не имеет значения.

Ответы [ 2 ]

5 голосов
/ 05 июля 2011

Достаточно быстрее, чтобы того стоило, в зависимости от вашего приложения. Но они должны быть быстрее.

Существует еще одна проблема, помимо скорости, которая связана с фрагментацией памяти и накладными расходами для каждого блока. GSlice оставляет malloc для работы с большими или переменными размерами, при этом обрабатывая небольшие объекты известного размера с большей эффективностью пространства.

2 голосов
/ 23 сентября 2011

Slice API в значительной степени заимствован из исследований, проведенных Sun Microsystems в 1980-х годах, и тогда он назывался распределением слябов. Я не смог найти оригинальную исследовательскую работу, но вот страница википедии об этом, или вы можете просто погуглить для "распределения плит".

По сути, это устраняет дорогостоящие операции выделения / освобождения, облегчая повторное использование блоков памяти. Это также уменьшает или устраняет фрагментацию памяти. Так что речь идет не только о скорости, хотя она и должна улучшить ее.

Если вы должны использовать или нет - это зависит ... Посмотрите на ответ Хавока - он суммировал его довольно хорошо.

Обновление 1:

Обратите внимание, что современные ядра Linux включают в себя SLAB-распределитель как один из вариантов, и он часто используется по умолчанию. Таким образом, разница между g_slice() и malloc() может быть незаметной в этом случае. Однако целью glib является кроссплатформенная совместимость, поэтому использование API-интерфейса слайса может несколько гарантировать стабильную производительность на разных платформах.

Обновление 2:

Как указал комментатор, мое первое обновление неверно. Распределение SLAB используется ядром для выделения памяти процессам, но malloc() использует не связанный механизм, поэтому утверждение, что malloc() эквивалентно g_slice() в Linux, недопустимо. Также см. этот ответ для более подробной информации.

...