Frage vector :: clear () kostet so viel Zeit?


Ich habe einen Profiler (sehr schläfrig) auf meinem Programm ausgeführt und er zeigt einen hohen Prozentsatz meiner Reset-Funktion (die Reset-Funktion läuft pro Frame). Das Programm sieht so aus:

Init-Abschnitt:

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

VecOfVecOfPath ist eine Reihe von Wegen, die von anderen Funktionen gefunden werden. VecOfVecOfPath [i] wird während der Ausführung pro Frame gefüllt. Z.B. Es ist push_backvon anderen Funktionen, und vor der Verwendung zurückgesetzt werden, pro Frame.

Die Reset-Funktion:

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

Das Zurücksetzen ist also sehr einfach, aber es hat einen ziemlich hohen Rang im Profiler.

Ist das üblich? Hat vector :: clear () solche Gemeinkosten sogar für eingebaute Typvektoren?

Vielen Dank!


Ich habe versucht, das Programm im Release-Modus zu bauen und dann die Kosten auf fast Null reduziert. Von 12 ~ 13% bis 0,03 ~ 0,04%.

Dann ging ich zum Quellcode von und es gibt definiert wie ITERATOR_DEBUG_LEVEL zusätzliche Operationen im Debug-Modus.

Es ist also wie @ Noggin182 vorgeschlagen, die Dinge sind im Debug und Release-Modus anders.

Zitat: "Meke sicher, dass Sie in Release-Build profilieren und suchen, um zu sehen, ob es irgendwelche Präprozessor-bedingte definiert, die Sie gesetzt, um die Leistung zu steigern. - noggin182 3. Januar um 15:32"


6
2018-01-03 14:50


Ursprung


Antworten:


Es hängt davon ab, was in Ihrem Vektor ist, wenn Ihre geschachtelten Vektoren Klassen enthalten, dann rufen Sie den d'tor für jede Instanz in den verschachtelten Vektoren auf. Ich bin mir ziemlich sicher, dass auch die Speicherfreigabe aufgehoben wird.

Es klingt wie du ein Spiel schreibst? Wenn ja, ein paar Bücher (PDFs), die ich beim Schreiben von Spielen gelesen habe, deuten darauf hin, dass Vektor gut für den allgemeinen Gebrauch ist, aber Sie werden besser dran sein, es NICHT für Spiele zu verwenden. Verwenden Sie native Arrays und verwalten Sie den Speicher selbst oder rollen Sie Ihre eigene Containerklasse.

Ist 640 die Obergrenze Ihres Vektors? Wäre es dir lieber, wenn du so etwas verwendest?

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

Dann könnte dein Reset-Call einfach sein

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

Sie können sogar noch beliebige STL-Funktionen wie diese verwenden:

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

Das ist ungefähr so ​​viel Hilfe, wie ich ohne weitere Informationen bereitstellen kann


1
2018-01-03 15:09