Porównanie wydajności mechanizmu alokacji pamięci C++ (tcmalloc vs. jemalloc)

Mam aplikację, która przydziela dużo pamięci i rozważam użycie lepszego mechanizmu alokacji pamięci niż malloc.

Moje główne opcje to: jemalloc i tcmalloc. Czy są jakieś korzyści z korzystania z jednego z nich nad drugim?

Jest dobre porównanie niektórych mechanizmów (w tym autorskiego mechanizmu -- lockless ) w http://locklessinc.com/benchmarks.shtml i wymienia pewne plusy i minusy każdego z nich.

Given że oba mechanizmy są aktywne i stale się poprawiają. Czy ktoś ma jakiś wgląd lub doświadczenie na temat względnej wydajności tych dwóch?

Author: Shayan Pooya, 2011-10-21

6 answers

O ile dobrze pamiętam, główną różnicą były projekty wielowątkowe.

Obie biblioteki starają się oddzielić pamięć od niezgodności, ponieważ wątki wybierają pamięć z różnych pamięci podręcznych, ale mają różne strategie:

  • jemalloc (używany przez Facebook) utrzymuje pamięć podręczną na wątku
  • W przeciwieństwie do innych wątków, które nie są w pełni kompatybilne z cache 'ami, threads nie jest w stanie używać cache' ów.]}

To doprowadziło, po raz kolejny, jeśli pamiętam prawidłowo, do ważnej różnicy w zakresie zarządzania wątkami.

  • jemalloc jest szybsze, jeśli wątki są statyczne, na przykład przy użyciu pul
  • tcmalloc jest szybszy, gdy wątki są tworzone / niszczone

Istnieje również problem, że ponieważ jemalloc obracanie nowych pamięci podręcznych, aby pomieścić nowe identyfikatory wątków, nagły skok wątków pozostawi (głównie) puste pamięci podręczne w następnej fazie spokoju.

W związku z tym polecam tcmalloc w ogólnym przypadku, i zarezerwować jemalloc dla bardzo specyficznych zastosowań(mała zmienność liczby wątków w okresie życia aplikacji).

 34
Author: Matthieu M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-10 06:52:35

Ostatnio rozważałem tcmalloc dla projektu w pracy. Oto co zaobserwowałem:

  • Znacznie poprawiona wydajność przy intensywnym użytkowaniu malloc w wielowątkowym ustawieniu. Użyłem go z narzędziem w pracy i wydajność poprawiła się prawie dwukrotnie. Powodem jest to, że w tym narzędziu było kilka wątków wykonujących alokacje małych obiektów w pętli krytycznej. Używając glibc, wydajność spada z powodu, myślę, blokowania sporów między malloc / free calls in różne wątki.

  • Niestety, tcmalloc zwiększa ilość pamięci. Narzędzie, o którym wspomniałem powyżej, zużywałoby dwa lub trzy razy więcej pamięci (mierzone przez maksymalny rozmiar zestawu rezydenta). Zwiększony ślad jest dla nas nie do pomyślenia, ponieważ w rzeczywistości szukamy sposobów na zmniejszenie śladu pamięci.

W końcu zdecydowałem się nie używać tcmalloc i zamiast tego zoptymalizować kod aplikacji bezpośrednio: oznacza to usunięcie alokacji z wewnętrznego pętle, aby uniknąć zatorów malloc / free lock. (Dla ciekawskich, za pomocą formy kompresji, a nie za pomocą puli pamięci.)

Lekcja dla ciebie będzie taka, że powinieneś dokładnie zmierzyć swoją aplikację z typowymi obciążeniami. Jeśli możesz sobie pozwolić na dodatkowe zużycie pamięci, tcmalloc może być dla Ciebie świetnym rozwiązaniem. Jeśli nie, tcmalloc jest nadal przydatne, aby zobaczyć, co zyskasz unikając częstych wywołań alokacji pamięci w różnych wątkach.

 10
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-04 11:21:51

Należy pamiętać, że według strony głównej' nedmalloc', alokatory współczesnego OS są teraz dość szybkie:

"Windows 7, Linux 3.x, FreeBSD 8, Mac OS X 10.6 zawierają najnowocześniejsze alokatory i żaden inny alokator nie może znacząco poprawić ich wyników w świecie rzeczywistym]}

Http://www.nedprod.com/programs/portable/nedmalloc

Więc może uda Ci się po prostu polecić użytkownikom upgrade lub coś w tym stylu:)

 4
Author: rogerdpack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 22:56:05

Możesz również rozważyć użycie Boehm conservative garbage collector . Zasadniczo każde malloc w kodzie źródłowym zamieniasz na GC_malloc (itd...), i nie zawracasz sobie głowy wydzwanianiem free. GC Boehm nie przydzielają pamięci szybciej niż malloc (jest mniej więcej taki sam, lub może być 30% wolniejszy), ale ma tę zaletę, że automatycznie radzi sobie z bezużytecznymi strefami pamięci, co może poprawić twój program(i na pewno ułatwia kodowanie, ponieważ nie obchodzi cię więcej o wolne). I GC Boehm może być również używany jako alokator C++.

Jeśli naprawdę uważasz, że malloc jest zbyt wolne (ale powinieneś porównywać; większość malloc - S zajmuje mniej niż mikrosekundę) i jeśli w pełni rozumiesz zachowanie alokacji Twojego programu, możesz zastąpić niektóre malloc - s specjalnym alokatorem (który może na przykład pobierać pamięć z jądra w dużych kawałkach za pomocą mmap i zarządzać pamięcią samodzielnie). Ale uważam, że robienie tego jest bolesne. W C++ masz alokator koncepcja i std::allocator_traits, z większością standardowych kontenerów szablonów akceptujących taki alokator (Zobacz też std::allocator), np. opcjonalny drugi argument szablonu do std::vector, itd...

Jak sugerowali inni, jeśli uważasz, że malloc jest wąskim gardłem, możesz przydzielać dane w kawałkach( lub używając Aren) lub po prostu w tablicy.

Czasami implementacja wyspecjalizowanego kopiowania garbage collector (dla niektórych danych) może pomóc. Rozważ być może posłowie .

Ale nie zapominaj, że przedwczesna optymalizacja jest zła i proszę porównać i profilować swoją aplikację, aby dokładnie zrozumieć, gdzie stracony jest czas.

 2
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 05:45:51
 1
Author: SunfiShie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 17:06:04

Twój post nie wspomina o threadingu, ale przed rozważeniem mieszania metod alokacji C i C++, chciałbym zbadać pojęcie puli pamięci.BOOST ma dobry.

 1
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-21 17:13:38