Malloc vs Custom Allocator: Malloc hat eine Menge Overhead. Warum?
Ich habe eine Bildkomprimierungsanwendung, die jetzt zwei verschiedene Versionen von Speicherzuweisungssystemen hat. Im ursprünglichen Fall wird malloc überall verwendet, und im zweiten Fall habe ich einen einfachen Pool-Allokator implementiert, der nur einen Teil des Speichers zuweist und Teile dieses Speichers an myalloc () -Aufrufe zurückgibt.
Bei der Verwendung von malloc ist ein enormer Speicherbedarf festzustellen: Auf der Höhe der Speichernutzung benötigt der malloc () - Code ungefähr 170 Megabyte Speicher für ein 1920 x 1080 x 16 bpp-Image, während der Pool-Allokator nur 48 Megabyte zuweist, von denen 47 werden vom Programm verwendet.
In Bezug auf die Speicherzuweisungsmuster weist das Programm dem Testbild eine Menge von 8-Byte- (die meisten), 32-Byte- (viele) und 1080-Byte-Blöcken (einige) zu. Abgesehen von diesen gibt es keine dynamischen Speicherzuordnungen im Code.
Das Betriebssystem des Testsystems ist Windows 7 (64 Bit).
Wie haben wir die Speichernutzung getestet?
Mit dem benutzerdefinierten Allokator konnten wir sehen, wie viel Speicher verwendet wird, da alle Malloc-Aufrufe an den Allokator weitergeleitet werden. Mit malloc () haben wir im Debug-Modus nur den Code durchgearbeitet und die Speichernutzung im Task-Manager beobachtet. Im Release-Modus haben wir dasselbe gemacht, aber weniger feinkörnig, weil der Compiler eine Menge Dinge wegoptimiert, so dass wir den Code nicht Stück für Stück durchgehen konnten (der Speicherunterschied zwischen Release und Debug betrug ungefähr 20 MB, was ich zuschreiben würde Optimierung und Fehlen von Debug-Informationen im Release-Modus).
Könnte Malloc allein die Ursache für solch einen enormen Overhead sein? Wenn ja, was genau verursacht diesen Overhead in malloc?