Sto lavorando su una grande applicazione server scritta usando C++. Questo server deve essere eseguito possibilmente per mesi senza riavviare. La frammentazione è già un problema sospetto qui, dal momento che il nostro consumo di memoria aumenta nel tempo. Finora la misura è stata quella di confrontare i byte privati con i byte virtuali e analizzare la differenza in questi due numeri.Pensare alla frammentazione della memoria mentre codifichi: Ottimizzazione prematura o no?
Il mio approccio generale alla frammentazione è di lasciarlo all'analisi. Ho lo stesso modo di pensare ad altre cose come le prestazioni generali e le ottimizzazioni della memoria. Devi eseguire il backup delle modifiche con analisi e prove.
Mi sto notando molto durante le revisioni o le discussioni sul codice, che la frammentazione della memoria è una delle prime cose che si presentano. È quasi come se ci fosse una grande paura ora e c'è una grande iniziativa per "prevenire la frammentazione" prima del tempo. Sono richieste modifiche al codice che sembrano favorevoli alla riduzione o alla prevenzione dei problemi di frammentazione della memoria. Io tendo ad essere in disaccordo con queste persone sin da quando mi sembrano un'ottimizzazione prematura. Vorrei sacrificare la pulizia del codice/la leggibilità/la manutenibilità/ecc. per soddisfare questi cambiamenti.
Ad esempio, prendiamo il seguente codice:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
Sopra, il numero di allocazioni del stringstream fa qui è indefinito, potrebbe essere 4 allocazioni, o solo 1 allocazione. Quindi non possiamo ottimizzare basandoci solo su questo, ma il consenso generale è quello di utilizzare un buffer fisso o in qualche modo modificare il codice per utilizzare potenzialmente meno allocazioni. Non vedo davvero che lo stringstream si espanda qui come un enorme contributore ai problemi di memoria, ma forse mi sbaglio.
proposte di miglioramento generale di codice di cui sopra sono lungo le linee di:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
C'è anche una spinta enorme per utilizzare lo stack sopra il mucchio dove mai possibile.
È possibile essere preventivi sulla frammentazione della memoria in questo modo, oppure si tratta semplicemente di un falso senso di sicurezza?
Penso che un modo semplice per giudicare sia questo: ti preoccupi di due cose nei programmi: correttezza dell'implementazione e efficienza di implementazione. Vogliamo tutti il massimo in entrambe le categorie, ma in pratica è meglio concentrarsi sulla correttezza rispetto all'efficienza, perché il programma sbagliato più efficiente del mondo è ancora sbagliato e ancora inutile. Dovresti concentrarti su entrambi al meglio delle tue capacità; * l'ottimizzazione prematura significa semplicemente concentrarsi più sull'efficienza che sulla correttezza *. Se hai la capacità di renderlo efficiente senza sacrificare la correttezza, dovresti assolutamente farlo! – GManNickG
'La frammentazione è già un problema sospetto qui, dal momento che il nostro consumo di memoria aumenta col passare del tempo. Le vecchie perdite di memoria sarebbero un sospetto molto più probabile a mio parere - potrebbe voler escluderle prima (e con un controllore di perdita di memoria come valgrind o drmemory è anche molto più facile che scrutare l'intero codice in base alle fonti di frammentazione) – smocking