Geschwindigkeit der STL (Standardbibliothek)
-
Ist die STL wirklich soooo langsam?
Im speziellen geht es um GROSSE Matrizen und mehrdimensionale Datenfelder. Ist die Bearbeitung und Speicherung mit Containern wesentlich langsamer als mit Zeigern?
Bsp.:
vector< vector<double> > stlMatrix; double **matrix;
Mirco
-
Es kommt immer auf den Cointainer an den du verwendest,
und, ob du ihn gescheiht einsetzt, also auch nicht falsch bedienst.Evtl. interessant könnte für dich die MTL sein:
http://www.osl.iu.edu/research/mtl/
http://www.osl.iu.edu/research/mtl/performance.php3Devil
-
Sofern es sich um eine vernünftige Implementierung handelt NEIN. Um schneller
zu sein musst dich schon sehr bemühen, insbesondere wenn du Verbesserungen
allgemeiner Art meist. Eigene Implementierungen machen meist nur ganz bei ganz
speziellen Anforderungen Sinn, die ein entsprechendes Optimierungspotential
beinhalten.
Vorausgesetzt natürlich, du setzt die STL auch sinngemäss vernünftig ein.
-
Container wurden nicht designed um als Elemente von Containern gut zu funktionieren. Da wäre ein Moveable ansatz viel besser, denn das viele kopieren macht die Performance schon kaputt...
-
mirco schrieb:
Ist die STL wirklich soooo langsam?
nein. für allgemeine sachen ist sie praktisch nicht zu überbieten. für viele jedes spezielle probleme kann man aber was bauen, was 5% schneller ist.
Im speziellen geht es um GROSSE Matrizen und mehrdimensionale Datenfelder.
wie voll?
Ist die Bearbeitung und Speicherung mit Containern wesentlich langsamer als mit Zeigern?
Bsp.:vector< vector<double> > stlMatrix; double **matrix;
nein, nicht wesentlich lahmer. wenn der speicher erstmal angelegt ist, dann ist der zugriff auf ein vector-element innendrin ja auch nur der zugriff über einen zeiger. ich würde sogar sagen, sie sind gleich schnell.
sobald man näheres über die daten weiß, kann man vesuchen, eine spezielle implemetierung zu suchen, die die allgemeine plattmacht. sind zum beispiel die matrizen sehr dünn besetzt? dann ietet sich ne hashtable an, die indexpaare auf die daten mappt. ist die matrix symmentrisch (evtl adjazenzmatrix), dann kann man 50% speicher sparen, vielleicht ist die matrix ja so groß, daß es was bringt. können die demensionen ner matrix zu compilezeit bestimmt werden? dann lohnt sich immerein seitenblich nach blitz++.
außerdem noch überlegen, ob mal double** (beim zugiff zweimal indirektion) oder double*(beim zurgiff einmal multiplikation und einmal indirektion) haben mag.