Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Vector und Geschwindigkeit?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.05.2008, 09:36 Uhr
~4g44rg
Gast


Hallo,

für meine ersten versuche in OpenGL benutze immer Vectoren für das speichern der Daten weil das so schön angenehm ist wenn man diese erweitern oder einzelne Elemente löschen möchte.

Jetzt habe ich aber in einem anderen Forum das hier gelesen ...


Zitat:
Wenn es nicht gerade zeitkritisch ist, nimm std::
vector<int>, das Vektor-Template aus der Standard Template Library.
Ist zwar langsam (vor allem die Implemenatation von Microsoft), aber
tut meistens.


Ist die Verwendung von Vectoren in denen die Daten zum Zeichnen und anderweitiger Verarbeitung stehen ungünstig?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2008, 11:28 Uhr
ao

(Operator)


Kommt auf die Verwendung an. Jede STL-Containerklasse hat ihre Vor- und Nachteile.

std::vector legt alle Daten zusammenhängend in den Speicher, dadurch ist der wahlfreie Zugriff über den Index-Operator ([]) schnell, ebenso der sequenzielle Zugriff (Drüberlaufen von Anfang bis Ende). Einfügen und Entfernen von Elementen ist dagegen langsam, weil u.U. jedesmal der ganze Datenbereich umkopiert werden muss.

Ein Gegenstück ist std::list (verkettete Liste), hier ist Einfügen und Entfernen an beliebigen Stellen sehr schnell, weil nur ein paar Zeiger umgehängt werden müssen. Sequenziell drüberlaufen ist auch schnell, Zugriff auf indizierte Elemente dagegen langsam, weil man sich an einem der Enden beginnend bis zum Ziel durchhangeln muss.

Die Wahl der geeigneten Containerklasse hängt also davon ab, was man mit dem Container anfangen will, welche Aktionen man am häufigsten macht (Optimierung der Über-Alles-Performance) bzw. welche speziellen Aktionen maximal schnell laufen müssen (Optimierung zeitkritischer Teile).

Glücklicherweise gibts eine Art "Basisschnittstelle", die für alle Container bestimmte Grundfunktionen bereitstellt (push_back, iterator, ...). Man kann also ohne große Quelltextänderungen den drunterliegenden Container austauschen und die Auswirkungen testen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.05.2008, 11:07 Uhr
RHBaum



Der vector der STL ist ein ersatz fuer ein Dynamisches Array ....
Also sowas wie:
int * Array = new int [1234];
oder eben die malloc schiene aus C

gegenueber sowas hat der vector keinerlei geschwindigkeitsnachteile, wenn man ihn richtig benutzt.

Aber, wohingegen er keine chance beim anlegen hat, ist nen statisches Array.
int Array[123];

Das Die Dinger langsam sein sollen, kommt eher von konzeptionellen Dingen.
z.b. das man den vector verwendet wenn das ding eigentlich aufn stack passen wuerde ...
oder wenn man vorher weiss, wie gross das ding wird, werden kann, und man es nicht richtig initialisiert, sondern den vector das selber ueberlaesst.
Unter C wuerd man nie auf den gedanken kommen, wenn man z.b. 1000 ints anlegen muss,
das array zuerstmal mit 10 ints erstellen, dann eines mit 20, die vorherigen werte rueberkopieren und weiter anfuegen, dann 40 ... 80 ... bis man mal bei 1000 ankommt.

Nen
std::vector<int> Array;

Array.push_back(value); // und das 1000 mal

wuerde z.b genau dies tun ...

Also der Komfort bricht hier dem Unbedarften performancetechnisch das Genick :-)
Dazu kommt das was ao schon beschreibt. Vector wird grad von neueinsteigern viel zu oft verwendet, wo ein anderer container bessere leistung erzielen wuerde.

Wenn Du haarstraeubende Beispiele aus der Praxis zum Anschauen haben willst ....
Such mal in den C't Archiven. Da gabs mal nen fetten Artikel zu performance zwischen C++, C# und Java.
Java und C# hat natuerlich super abgeschnitten :-)
Wenn man den C++ code, der die STL verwendet hat, analysiert hat, wusste man auch sofort warum ....
Lapidarer kommentar des Autors zu den protesten von C++ Entwicklern:
Er habe die Stl so benutzt wie man sie halt üblicherweisse benutzen wuerde.
Kein wunder das c++ den ruf geniest, performance zu verschenken, wenn das ueblich ist :-)

Ciao....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.05.2008, 15:33 Uhr
xXx
Devil


Nen std::vector<int>(1234); ist nicht langsamer als nen new int[1234](); ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: