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?


  • Administrator

    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.


  • Administrator

    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.html

    Blue-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::vector leeren möchtest? Darauf verzichten? Den std::vector nochmals wrappen, um diese Verhalten zu verhindern? Ich meine, nichts dagegen, dass man clear nicht aufrufen soll, wenn man den std::vector nicht leeren will, aber wer ruft dann schon clear auf? 😉

    Grüssli



  • windschief schrieb:

    hmm, kann mir nicht irgendwie jemand noch einen tipp geben was ich verbessern kann?

    Wenn du bei std::vector im Voraus die ungefähre Anzahl Elemente kennst, kannst du die Memberfunktion reserve() 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 foo kapselst, 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.html

    Hmmm..... hoppla, hab nur gesehen dasss ~vector den gleichen Aufruf enthaelt wie clear() und ging davon aus dass das ergo auch den Speicher freigibt. aber vector erbt ja von vector_base 🙂 Mea culpa

    Blue-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::vector leeren möchtest? Darauf verzichten? Den std::vector nochmals wrappen, um diese Verhalten zu verhindern? Ich meine, nichts dagegen, dass man clear nicht aufrufen soll, wenn man den std::vector nicht leeren will, aber wer ruft dann schon clear auf? 😉

    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


Anmelden zum Antworten