Malloc a niestandardowy alokator: Malloc ma dużo narzutów. Czemu?
Mam aplikację do kompresji obrazów, która ma teraz dwie różne wersje systemów alokacji pamięci. W oryginalnym malloc jest używany wszędzie, aw drugim zaimplementowałem prosty alokator puli, który po prostu przydziela część pamięci i zwraca części tej pamięci do wywołań myalloc ().
Zauważyliśmy ogromne obciążenie pamięci, gdy używany jest malloc: w szczytowym momencie używania pamięci kod malloc () wymaga około 170 megabajtów pamięci na obraz 1920x1080x16bpp, podczas gdy alokator puli przydziela tylko 48 megabajtów, z czego 47 są używane przez program.
Jeśli chodzi o wzorce alokacji pamięci, program przydziela obrazowi testowemu wiele bloków 8-bajtowych (większość), 32-bajtowych (wiele) i 1080-bajtowych (niektóre). Poza tym w kodzie nie ma dynamicznych alokacji pamięci.
OS systemu testowego to Windows 7 (64 bity).
Jak przetestowaliśmy użycie pamięci?
Za pomocą niestandardowego alokatora można było zobaczyć, ile pamięci jest używane, ponieważ wszystkie wywołania malloc są zablokowane w alokatorze. W malloc () w trybie debugowania przeszliśmy przez kod i obserwowaliśmy wykorzystanie pamięci w menedżerze zadań. W trybie wydania zrobiliśmy to samo, ale mniej drobnoziarniste, ponieważ kompilator optymalizuje wiele rzeczy, więc nie mogliśmy przejść przez kawałek kodu po kawałku (różnica pamięci między wydaniem a debugowaniem wynosiła około 20 MB, co przypisałbym optymalizacja i brak informacji debugowania w trybie zwolnienia).
Czy sam malloc może być przyczyną tak dużego obciążenia? Jeśli tak, co dokładnie powoduje ten narzut wewnątrz malloc?