2013-08-22 9 views
5

Mam program C++, który jest znacznie wolniejszy na OS X 10.8.2 niż na Linuksie. Profilowanie pokazuje, że powodem jest to, że wywołania za darmo (wynikające z operacji STL, FWIW) są znacznie wolniejsze w systemie OSX, ponieważ wywołują i wywołują madvise, a rzeczywisty czas jest tam konsumowany.Kiedy "wolna" biblioteka MacOSX nazywa się madvise i czy istnieje jakikolwiek sposób na jej kontrolowanie?

Czy istnieje sposób modulacji tego zachowania systemu OS/X?

Odpowiedz

2

No tak!

Miałem straszne problemy z wydajnością z malloc/free w Linuksie i zacząłem szukać zamiennika. Dwie opcje przyszedł na myśl tbbmalloc (część Intel TBB, która jest wolna BTW) i Google malloc. Po szeroko zakrojonych testach nie było jasne, który był szybszy (z dwóch), ale oba były znacznie szybsze niż wdrożenie LIBC.

Poszedłem z tbbmalloc, ponieważ działało płynniej, google malloc miał błąd, który powodował, że pamięć wirtualna była bardzo duża (zarezerwowana, ale nie zatwierdzona), co było bardzo złe dla mojej aplikacji (demony IT by ją zabiły).

Dobre: ​​

  • dużo lepszą wydajność niż malloc LibC za. Było 3x-300x w ciężkiej aplikacji STL.
  • Prosta integracja. Bez zmiany kodu. Dodaj/zmień 1 linię pliku makefile pliku wykonywalnego. Bez zmian w SO.

Złe:

  • Mem warcaby nie będzie z zamienników. dla pliku memkk/valgrind/etc. powrócić do pierwotnego malloc.
  • Aplikacja zabrałaby o 10-30% więcej pamięci.

Aplikacja, którą stworzyłem, była aplikacją CAD, która używała 10s GB, budując i niszcząc 10 milionów różnych struktur (wiele map STL, wektorów, map hash).

Jak to zrobić:

W poleceniu łącznikową, dodać -ltbbmalloc i upewnić się, że biblioteka jest w lib ścieżce wyszukiwania (-L flag).

Powiązane problemy