Boost Iterator bei PTR Container Geschwindigkeit
-
Ist es möglich das die Iteratoren im Verhältniss zu einer normalen Integer-For-Schleife ziemlich langsam sind oder mache ich irgendwas krass falsch?
im Vector sind ~40 Elemente(die Schleife wird 1 mal pro Frame durchlaufen):
for (int i = 0; i<_Stars.size(); i++) { _Stars[i].Tick(); }entspricht 10000 FPS
for (boost::ptr_vector<CBStar>::iterator i = _Stars.begin(); i != _Stars.end(); i++) { i->Tick(); }entspricht 5500 FPS
-
Naja, so extrem langsamer scheint es ja nicht zu sein. Ein Faktor 2 ist nicht die Welt. Und ja, sie sind langsamer. Der Vergleichsoperator != wird als Methodenaufruf bei Iteratoren realisiert, waehrend bei int != direkt als Assemblerbefefehl zur Verfuegung steht. Das gleiche gilt auch fuer ++ und -> . Somit verwundert es nicht. Natuerlich solltest du auch mal maximale Optimierung anschalten (mit g++ ist es die Option -O3). Desweiteren verstehe ich nicht, welche Gruende fuer boost::ptr_vector sprechen, teste doch mal mit std::vector<CBStar*>.
-
++i statt i++
und iterator debugging deaktivieren.und nein, iteratoren sind nicht generell langsamer als nicht iteratoren.
die beiden codes sind übrigens auch unterschiedlich. bei einem hast du einen container voller T* und bei einem einen voller T.
-
und NDEBUG definieren!

-
Blue-Tiger schrieb:
und NDEBUG definieren!

Das sollte im Release-Modus automatisch definiert sein (zumindest unter MSVC++).
FunMaker, welche IDE benutzt du? Kompilierst du im Release-Modus und sind die Optimierungen auf Maximum? Shades Hinweis, ++i statt i++ zu nehmen, könnte schon einiges bewirken, da dann unnötige Kopien wegfallen.
-
Und wenn es sicher ist, das du die Liste nicht änderst, kannst du dir einen ständigen Funktionsaufruf von .end() auch sparen. Ich weiß aber nicht ob dies der Compiler von sich aus optimieren kann:
for(boost::ptr_vector<CBStar>::iterator it = _Stars.begin(), end = _Stars.end(); it != end; ++it) it->Tick();for(<1>;<2>;<3>)
1: Wird einmalig zu Beginn aufgerufen
2: Wird vor jedem Schleifendurchgang ausgeführt
3: Wird nach jedem Schleifendurchgangs ausgeführtcu André
-
Erst einmal danke für die Antworten. Ich denke ich werde auf die Iteratoren verzichten da mir der Einbruch schon etwas zu stark ist (und mir ehrlich Iteratoren eher unsympatisch sind auch wenn sie gewisse Vorzüge haben).
@knivil: Ich hatte zunächst Probleme(bzw. ich musste alles hin und herreferenzieren das es ging - sah sehr unschön aus) mit dem de/referenzieren von den Elementen in einem STL Container - da habe ich mich für den ptr_container entschieden - letztendlich liegt ja auch nur nen STL Container drunter
@Shade of Mine: wechsel von i++ auf ++i hat immerhin 500 fps mehr gebracht

@Nexus: VS2008 Express. Habe es mal mit Release kompiliert da springt er von 10000 auf 20000 und bei der Iterator Variante auf 8500
@asc: Ist von der Geschwindigkeit fast kein Unterschied
-
FunMaker schrieb:
VS2008 Express
Tu mal
Secure SCL
und
Checked Iterators
lesen.PS:
und tu iteratoren verwenden. das tut besser sein tun.
-
shade tu mal aufhören volkard nachzumachen