optimierung mit gcc



  • ahoi,

    ich versuche gerade mein programm zu optimieren und habe jetzt mithilfe von -o3 beim gcc und mit dem weglassen von einigen printfs schon gut 6 minuten bei der berechnung gespart, allerdings laeuft es immer noch ganze 17 minuten...

    ich vermute, dass der langsamste teil des programmes der zugirff auf dateien ist. ich benutzte hauptsaechlich standard - funktionen wie fopen und getc sowie sprintf oder strcpy, kann man da noch was machen?

    oder gibt es noch weitere flags fuer den gcc oder andere tricks um rechenzeit zu sparen?

    der.Moh 🙂



  • Moh schrieb:

    ich vermute, dass

    Solange du noch vermutest wird jeder Versuch etwas zu optimieren ein Schuss ins Blaue sein. Du musst profilen, sprich herausfinden wo genau die meiste Zeit draufgeht, und dann an genau den Stellen optimieren. Das meiste Potential dürfte dabei ohnehin mehr in intelligenteren Algorithmen als in Compilerschaltern oder Mikrooptimierungen zu finden sein. Für Dateizugriffe könnten systemspezifische Funktionen zwar schneller sein als die Standard-Dinger, aber das jetzt blind zu ändern wäre albern.



  • du sollst nicht vermuten. jage einen profiler drüber, schaue, wo es wirklich hängt und dann kann dir vllt auch geholfen werden.
    die allgemeingültigen optimierungsflags sind in -02 und -03 eigentlich alle mit drin. speziellere hängen von deinem code ab.



  • ja das war sinnvoll, die md5 funktion, die ich aus einer externen quelle habe und auch nicht vaendern kann, schluckt den großteil der rechenzeit... dagegen fallen funktionen wie strcmp und memcpy gar nicht weiter ins gewicht, bzw sind die einzigen die ueberhaupt gelistet werden.



  • probiers damit: ftp://ftp.isi.edu/pub/hpcc-papers/touch/md5-opt.tar.Z
    wenn das nicht hilft, dann vielleicht eine in assembler geschriebene version von md5. welchen prozessor nutzt du?
    🙂



  • der sieht meinem code ziemlich aehnlich, hat allerdings leichte aenderungen... muss ich mir mal genauer anschauen und testen.

    ich hab nen x86 centrino



  • ^^probiers aus. ansonsten: für x86 wird sich im netz leicht eine asm-variante von md5 finden lassen. ich hab' mal die geschwindigkeit einer crypto-funktion, die ausgiebig sha-1 verwendet, durch den einsatz von assembler um ca. faktor 10 beschleunigen können.
    🙂



  • Die Frage ist doch was für eine Zeit erwartest du denn? Ist ja klar, dass es Teile deines Codes gibt die die meiste Rechenzeit verschlingen, ich erinnere an die 90:10 Regel (10% des Codes verschlingen 90% der Rechenzeit).
    Wenn du keinen Grund zur Annahme hast, dass die Implementierung des MD5 Algorithmus nicht optimiert wurde, dann kannst du nichts mehr wirklich rausholen. Alles was über O2/O3 hinaus geht hat kaum mehr einen spürbaren Performancegewinn.
    Da sollte man die Zeit besser in einen anderen (besseren) Algorithmus investieren.

    Brauchst du z.B. unbesingt MD5, oder geht auch an anderes Hashing Verfahren, das weniger Rechenzeit benötigt?



  • Ich habe bei weitem nicht so große Programme, mein kompilieren dauert (mit umrechnen von 8 *.c in *.dll files) so ca. 10 - 20 sekunden... was nicht heißt das ich nciht optimieren muss..

    Hier ein paar fragen von nem anfänger xD:

    ghorst schrieb:

    du sollst nicht vermuten. jage einen profiler drüber, schaue, wo es wirklich hängt und dann kann dir vllt auch geholfen werden.
    die allgemeingültigen optimierungsflags sind in -02 und -03 eigentlich alle mit drin. speziellere hängen von deinem code ab.

    Was ist ein Profiler?



  • lippoliv schrieb:

    Ich habe bei weitem nicht so große Programme, mein kompilieren dauert (mit umrechnen von 8 *.c in *.dll files) so ca. 10 - 20 sekunden... was nicht heißt das ich nciht optimieren muss..

    es geht nicht darum, wie langer der compiler zum übersetzen braucht, sondern darum, dass das resultat zu viel zeit verbrät.

    lippoliv schrieb:

    Was ist ein Profiler?

    das ist ein speziell ausgebildeter kriminalist, der tätern mit wissenschaftlichen methoden der psychologie, soziologie, etc. auf die schliche kommt.
    ne, im ernst: so schimpfen sich tools zur performanceanalyse von programmen.
    🙂



  • Gut danke... 🙂
    sind die freeware/open source/anwendbar?

    Würde gerne mal ein Programm von mir "analysieren" lassen xD 😉



  • lippoliv schrieb:

    Gut danke... 🙂
    sind die freeware/open source/anwendbar?

    kommt auf die toolchain drauf an. was nimmts du? gcc/mingw? dafür gibts den 'gprof'. ich weiss aber nicht, ob der was taugt. lcc-win32 hat auch 'nen profiler dabei.
    🙂



  • Danke! Werds mal testen



  • lippoliv schrieb:

    Gut danke... 🙂
    sind die freeware/open source/anwendbar?

    Würde gerne mal ein Programm von mir "analysieren" lassen xD 😉

    Valgrind ist die Nr.1

    Aber das läuft nur unter Linux.
    Falls dein Code portabel sein sollte, sollte aber das kein problem sein.

    http://de.wikipedia.org/wiki/Valgrind



  • weil valgrind auch soviel mit performanceoptimierung zu tun hat 🙄



  • sothis_ schrieb:

    weil valgrind auch soviel mit performanceoptimierung zu tun hat 🙄

    Zum Profilen ist es Tool Nr. 1

    Das sagen alle.


Anmelden zum Antworten