iteration über std::vector langsamer als pointerarithmetik über array?
-
Hallo,
ich bin mir mit der Frage sehr unsicher - ich hatte mal ein Programm geschrieben welches auf der std lib aufsetzte. Ich hatte dann alles umgeschrieben und mich von der stdlib entfernt - alle arrays wurden dann über double* arr = malloc(...) aloziiert. Schleifen habe ich dann über pointerarithmetik umgeschrieben und nicht mehr mit iteratoren gearbeitet und seltsamerweise war das resultat ein viel schnelleres Programm. Kann das sein oder habe ich hier eine falsche Vorstellung? Ich kann es mir bis heute nicht erklären - aber es ist so wie ich es schreibe. Natürlich denkt ihr jetzt das liegt an meinem code - ich kanns auch nicht hier präsentieren, da ich die alte version mit der stdlib nicht mehr habe....
Danke für Hilfe
-
gast_xy schrieb:
...ich hatte mal ein Programm geschrieben welches auf der std lib aufsetzte. Ich hatte dann alles umgeschrieben und mich von der stdlib entfernt... seltsamerweise war das resultat ein viel schnelleres Programm.
Grundsätzlich kannst du ohne STL auf manuellen Weg ein schnelleres Programm als mit STL schreiben. Hierbei musst du aber mehrere Dinge berücksichtigen:
Hast du die STL so verwendet, das du sie nicht von Haus ausgebremmst hast (z.B. einen Vektor ständig vergrößert obwohl vorher bekannt war das du mehr elemente brauchst; verwendung von Zugriffsmethoden mit Bereichsprüfung kontra ohne Bereichsprüfungen?)...
Was ist dir wichtig: das letzte Quentchen Geschwindigkeit oder bessere Wartbarkeit?Unabhängig davon: Ich glaube das man bei einem richtigen Umgang mit der STL zwar ein wenig langsamer als Handoptimiert ist, aber ein "viel schnelleres" Programm erwarte ich bei dem Verzicht auf die STL eigentlich nicht.
cu André
-
Es ist zwar Implementierungsabhängig, aber im Normalfall sind die Iteratoren von std::vector gewöhnliche Zeiger, worduch das darüberiterieren keinen unterschied machen dürfte. Vermutlich lag es eher an dem vom Vorposter beschriebenen ständigen vergrößern des vectors, statt einem vorzeitigen reserveriens. Prinzipiell sollte die Verwendung eines std::vectors nicht viel langsamer sein als ein pures Array.
-
hab mich verpostet....bitte löschen
-
hmm es könnte durchaus sein, dass ich vektoren in ihrer Länge beeinflusst habe im Nachhinein.
Leider geht es mir als erstes Kriterium um Geschwindigkeit. Ich habe ein sehr rechenintensives (viele for-schleifen über arrays) so dass es sich wirklich summieren könnte...Danke für eure Hilfe
-
In diesem Fall könnten normale Array schon einiges an geschwindigkeit bringen.
Das ist natürlich trotzdem kein Grund malloc und co. zu verwenden, new tut es auch.
-
Braunstein schrieb:
In diesem Fall könnten normale Array schon einiges an geschwindigkeit bringen....
Aber nur, wenn er dabei die Größe nicht auch ändert ... und wenn er das Ändern der Größe da vermeiden kann, kann er es auch bei vector vermeiden.

Also ich denke: Array und vector analog verwendet, sollten gleich schnell sein.
Gruß,
Simon2.
-
Das hat nicht nur was mit Größenänderungen zu tun. Ich habe ebenfalls die Erfahrung gemacht, dass auch der Zugriff über vector langsamer sein kann als bei einem normalen Array. Mag sein das es wenig ist, aber sehr vielen Zugriffen kann das schon etwas ausmachen. Auch bei unserer Software (numerische Simulationen) kommt es sehr auf Geschwindigkeit an.
-
Braunstein schrieb:
Das hat nicht nur was mit Größenänderungen zu tun. Ich habe ebenfalls die Erfahrung gemacht, dass auch der Zugriff über vector langsamer sein kann als bei einem normalen Array...
Hier gibt es mehrere Fragen von meiner Seite:
a) Wie greifst du auf die Vektorelemente zu [] oder at?
b) Wie verwendest du den Vektor in Schleifen (bzw. wie sieht der Schleifenkopf aus... Häufiger Fehler an dieser Stelle sind ständige Methodenaufrufe des Vektors)
c) Nutzt du die Algorithmen der STL, sofern passend?cu André
-
a) mit []
b) ich rufe size() nicht ständig neu auf.
c) im Berechnungskern nicht.
-
Hier gibt es irgendwo einen Beitrag, in dem gemessen wurde, wie Iteration über Array und Vector mittels Zeiger und Iterator sich zueinander verhalten. Ich meine mich zu erinnern dass bei abgeschalteter Secure-STL (Microsoft) und Release-Build (Perf.-Optimierung an) alle getesteten Implementierungen von der Ausführungsgeschwindigkeit her identisch waren.
Müsste den Thread mal raussuchen.
-
Hallo,
Ich kenne den Thread. Es könnte ja durchaus sein, dass dieses verhalten Compilerabhängig ist. Wir hatten das damals auf dem BCB4 getstet.
-
Hier ist der Thread zu finden.
Braunstein! Welchen Compiler benutzt du? Der MSVC8 benutzt gutgemeint die Secure-Lib, d.h. es wird ALLES überprüft, was schief gehen könnte. Kann man aber abschalten. Siehe den verlinkten Thread.
EDIT: Naja, daaaamals auf dem BCB4.
Probier es heute einfach nochmal aus, mit ner vernünftigen Implementierung. 
-
Mach ich vielleicht sogar mal.

Ich habe jetzt hauptsächlich den BCB2007 im Einsatz. Der soll ja deutlich standardkonformer sein.