Ogni volta che si dispone di un'applicazione che ha un percorso critico ad alte prestazioni, è necessario considerare il modo in cui si tratta la memoria. La maggior parte delle applicazioni lato client dell'utente finale non rientra in questa categoria perché sono primarie basate sugli eventi e la maggior parte degli eventi proviene da interazioni con l'utente e che non ha molti (se non tutti) vincoli di prestazione.
Tuttavia, molti software di back-end dovrebbero concentrarsi su come viene gestita la memoria perché molti di questi software possono scalare per gestire un numero maggiore di client, un numero maggiore di transazioni, più origini dati .... Una volta avviato spingendo i limiti, puoi iniziare ad analizzare come la memoria degli utenti del tuo software e scrivere schemi di allocazione personalizzati su misura per il tuo software piuttosto che fare affidamento su un allocatore di memoria completamente generico che è stato scritto per gestire qualsiasi caso d'uso immaginabile.
Per darvi alcuni esempi ... nella mia prima azienda ho lavorato su un pacchetto Historian, software responsabile della raccolta / archiviazione / archiviazione dei dati di controllo di processo (pensate a una fabbrica, una centrale nucleare o una raffineria di petrolio con 10 milioni di sensori, archiviamo tali dati). Ogni volta che analizzavamo eventuali colli di bottiglia delle prestazioni che impedivano allo storico di elaborare più dati, la maggior parte delle volte il problema riguardava il modo in cui veniva gestita la memoria. Abbiamo fatto di tutto per assicurarci che malloc / free non fossero chiamati a meno che non fossero assolutamente necessari.
Nel mio attuale lavoro, lavoro sul registratore digitale di videosorveglianza e sul pacchetto di analisi. A 30 fps, ogni canale riceve un fotogramma video ogni 33 millisecondi. Sull'hardware che vendiamo, possiamo facilmente registrare 100 canali di video. Questo è un altro caso per assicurarsi che nel percorso critico (chiamata di rete => componenti di acquisizione => software di gestione del registratore => componenti di archiviazione => disco) non vi siano allocazioni di memoria dinamica. Abbiamo un allocatore di frame personalizzato, che contiene bucket di buffer di dimensioni fisse e utilizza LIFO per riutilizzare i buffer allocati in precedenza. Se hai bisogno di 600 Kb di spazio di archiviazione, potresti finire con un buffer di 1024 Kb, che spreca spazio, ma poiché è su misura specificamente per il nostro uso in cui ogni allocazione ha una durata molto breve, funziona molto bene perché viene utilizzato il buffer,
Nel tipo di applicazioni che ho descritto (spostare molti dati da A a B e gestire un gran numero di richieste client) andare all'heap e viceversa è una delle principali fonti di colli di bottiglia nelle prestazioni della CPU. Mantenere la frammentazione dell'heap al minimo è un vantaggio secondario, tuttavia per quanto ne so la maggior parte dei sistemi operativi moderni implementa già heap a bassa frammentazione (come minimo so che Windows lo fa, e spero che lo facciano anche altri). Personalmente, in oltre 12 anni di lavoro in questi tipi di ambienti, ho visto problemi di utilizzo della CPU legati all'heap abbastanza frequentemente, mentre mai una volta ho visto un sistema che soffriva di un heap frammentato.