2012-01-03 17 views
5

Ho eseguito un profiler (molto assonnato) sul mio programma e mostra un'alta percentuale sulla mia funzione di reset (la funzione di reset gira per fotogramma). I programmi aspetto:vector :: clear() costano così tanto tempo?

Init Sezione:

std::vector<std::vector<int>> VecOfVecOfPath; 
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640); 

VecOfVecOfPath è una serie di percorso trovato da altre funzioni. VecOfVecOfPath [i] verrà riempito durante l'esecuzione, per frame. E.g. È push_back -edato da altre funzioni e ripristinato prima dell'uso, per frame.

La funzione di reset:

void Reset() 
{ 
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear(); 
} 

Così il ripristino è molto semplice, ma hanno una bella alto posizionamento nei profiler.

È comune? Vector :: clear() ha tali overhead anche per i vettori di tipo built-in?

Grazie!


Ho provato a creare il programma in modalità di rilascio e quindi il costo ridotto quasi a zero. Dal 12 ~ 13% a 0,03 ~ 0,04%.

Quindi sono passato al codice sorgente di e ci sono definizioni come ITERATOR_DEBUG_LEVEL che effettuano operazioni aggiuntive in modalità Debug.

Quindi è come suggerito @ noggin182, le cose sono diverse nella modalità Debug e Release.

Citazione: "Meke che si sta profilando in build di rilascio e di ricerca per vedere se ci sono preprocessore condizionale definisce si imposta per migliorare le prestazioni - noggin182 3 gennaio alle 15:32."

+0

Hai considerato che chiami 'clear' inutilmente? –

+0

@parapurarajkumar: la prima cosa che mi è venuta in mente. Penso che abbiamo bisogno di maggiori dettagli sull'uso di 'VecOfVec' - forse i Vec possono essere riciclati per evitare la cancellazione. –

+4

vettore di vettore di cosa? –

risposta

1

Dipende da ciò che è nel tuo vettore, se i tuoi vettori annidati contengono classi, invierai il nome per ogni istanza nei vettori annidati. Sono abbastanza sicuro che anche la memoria verrà cancellata.

Sembra che tu stia scrivendo un gioco? Se è così, alcuni libri (PDF) che ho letto sulla scrittura del gioco suggeriscono che il vettore è buono per l'uso generale, ma sarà meglio non usarlo per i giochi. Basta utilizzare gli array nativi e gestire autonomamente la memoria o eseguire il rollover della propria classe contenitore.

640 è il limite superiore del vettore? Staresti meglio forse usando qualcosa del genere?

sometype Values[20][640]; 
int size[20]; 

Poi la chiamata di ripristino potrebbe essere solo

for(int i=0; i<20; i++) size[0] = 0; 

Sarà ancora anche essere in grado di utilizzare tutte le funzioni STL in questo modo:

std::sort(Values[i], Values[i] + size[i]); 

Quello è circa tutto l'aiuto che posso fornire senza ulteriori informazioni

+0

è di tipo int, quindi ho pensato che non ci sarebbe voluto molto tempo a svuotare(). E pensavo che gli array nativi fossero gli stessi dei vettori se lo riservassi correttamente()? Quindi i vettori non effettueranno la riassegnazione, quindi è veloce. –

+0

ok, se è un vettore int allora avrei pensato che questo non dovrebbe essere così lento. Che compilatore stai usando? Non ho esaminato tutte le implementazioni del vettore, ma sono rimasto sorpreso di quanto fossero diverse tra MSVC, Borland e GCC. Hanno anche tutti gli switch per abilitare determinati controlli di sanità e debug ed eseguire attività come il controllo dell'intervallo e il mascheramento, assicurandosi di utilizzare solo gli iteratori sul contenitore per cui sono destinati. Assicurati di eseguire il profiling nella build di rilascio e cerca di verificare se esistono condizionali preprocessuali che definiscono l'impostazione per migliorare le prestazioni. – noggin182

+0

Sto usando VS2010 professionale. Proverò a rilasciare build entro questa mattina e riferire i risultati, grazie! –

Problemi correlati