größtmögliche Effizienz / vector? / boost
-
hmm, kann mir nicht irgendwie jemand noch einen tipp geben was ich verbessern kann?
auch nur irgendein stichwort...
-
Mach aus den Code doch mal verschiedene Funktionen (z. B. einen fuer jeden Bedingungs-Abschnitt) und profile es, dann siehst du wo das Problem wirklich liegt.
Ansonsten: vermeide clear()s, die koennen intern Speicher freigeben ==> langsam.
-
Blue-Tiger schrieb:
Ansonsten: vermeide clear()s, die koennen intern Speicher freigeben ==> langsam.
Ähmm... Nein?
-
unskilled schrieb:
Blue-Tiger schrieb:
Ansonsten: vermeide clear()s, die koennen intern Speicher freigeben ==> langsam.
Ähmm... Nein?
Soweit ich weiss, macht der Standard keine Aussage darüber, also könnte theoretisch Speicher freigegeben werden. Trotzdem empfinde ich die Empfehlung als ein wenig fragwürdig.

Grüssli
-
In der GNU Implementierung der Standardlib wird bei jedem clear() der Speicher des vector freigegeben. Aber auch in Implementierungen, die den Speicher nicht freigeben muesste das clear() zumindest die Dtors aller gespeicherten Elemente aufrufen ==> potentiell relativ teuer.
-
Blue-Tiger schrieb:
In der GNU Implementierung der Standardlib wird bei jedem clear() der Speicher des vector freigegeben.
Wie kommst du denn darauf? Hast du das schon mal nachgeprüft? Also ich kann nichts dergleichen finden:
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01371.htmlBlue-Tiger schrieb:
Aber auch in Implementierungen, die den Speicher nicht freigeben muesste das clear() zumindest die Dtors aller gespeicherten Elemente aufrufen ==> potentiell relativ teuer.
Und was willst du machen, wenn du den
std::vectorleeren möchtest? Darauf verzichten? Denstd::vectornochmals wrappen, um diese Verhalten zu verhindern? Ich meine, nichts dagegen, dass manclearnicht aufrufen soll, wenn man denstd::vectornicht leeren will, aber wer ruft dann schonclearauf?
Grüssli
-
windschief schrieb:
hmm, kann mir nicht irgendwie jemand noch einen tipp geben was ich verbessern kann?
Wenn du bei
std::vectorim Voraus die ungefähre Anzahl Elemente kennst, kannst du die Memberfunktionreserve()einsetzen. Übertreibe es aber nicht, sonst verschwendest du Speicher. Genaueres dazu steht auf www.cplusplus.com.Und noch etwas, das sich nicht auf Optimierungen bezieht: Wenn du die Klasse
fookapselst, dann konsequent. Sprich: Keine öffentlichen Membervariablen.
-
Dravere schrieb:
Blue-Tiger schrieb:
In der GNU Implementierung der Standardlib wird bei jedem clear() der Speicher des vector freigegeben.
Wie kommst du denn darauf? Hast du das schon mal nachgeprüft? Also ich kann nichts dergleichen finden:
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01371.htmlHmmm..... hoppla, hab nur gesehen dasss
~vectorden gleichen Aufruf enthaelt wieclear()und ging davon aus dass das ergo auch den Speicher freigibt. aber vector erbt ja von vector_base
Mea culpaBlue-Tiger schrieb:
Aber auch in Implementierungen, die den Speicher nicht freigeben muesste das clear() zumindest die Dtors aller gespeicherten Elemente aufrufen ==> potentiell relativ teuer.
Und was willst du machen, wenn du den
std::vectorleeren möchtest? Darauf verzichten? Denstd::vectornochmals wrappen, um diese Verhalten zu verhindern? Ich meine, nichts dagegen, dass manclearnicht aufrufen soll, wenn man denstd::vectornicht leeren will, aber wer ruft dann schonclearauf?
Grüssli
hmmm.. stimmt, hatte wohl so richtig nicht nachgedacht

-
Huhu,
ich habe mir jetzt noch einen eigenen Kopierkonstruktor gemacht.
Er wird ca. 150000000 mal aufgerufen. Leider ist es mit meinem eigenen viel langsamer...Also einfach:
Foo(const Foo& other){ a=other.a; //usw }bringt wohl nix.. gibts nen Trick? Oder braucht man eigentlich keinen wenn man keine Pointer-klassenvariablen hat..
-
trick: initialisierungsliste
nein, man braucht keinen, wenn flache kopien reichen
bb