Sourcecode optimieren



  • Hi,

    ich weiß, das der Compiler bereits Optimierungen am Code vornimmt und unnötige/umständliche Konstrukte verbessert. Ich suche jetzt aber ein Tool, welches mir bestehenden Sourcecode analysiert und ggf. optimiert bzw. klare Hinweise gibt, was ich optimieren kann.

    Das ganze dient Demonstrationszwecken, ich will die Compileroptimierung damit nicht ersetzen.

    Deswegen: kennt jemand Tools, die so etwas auf Sourcecodeebene zuverlässig leisten ohne den Code kaputt zu machen?

    Danke!


  • Mod

    Wenn es so etwas gäbe, wieso wäre das dann kein Teil eines jeden Compilers?



  • SeppJ schrieb:

    Wenn es so etwas gäbe, wieso wäre das dann kein Teil eines jeden Compilers?

    Weil es für den Compiler komplizierter und unsinnig umständlich wäre, den Sourcecode in einer Art und Weise umzustellen, so dass dieser kompilierbar bleibt?


  • Mod

    Harstad schrieb:

    SeppJ schrieb:

    Wenn es so etwas gäbe, wieso wäre das dann kein Teil eines jeden Compilers?

    Weil es für den Compiler komplizierter und unsinnig umständlich wäre, den Sourcecode in einer Art und Weise umzustellen, so dass dieser kompilierbar bleibt?

    Jetzt führ den Gedankengang mal weiter: Wieso sollte dann jemals jemand solch ein Werkzeug entwickeln wollen, wenn es doch nur schlechter und komplizierter wäre als die normale Methode?

    PS: Damit wir auf gleicher Linie sind: Dir ist bekannt, dass das, was der Optimierer mit dem Maschinencode macht, kein Äquivalent im Quellcode hat? Es gibt kein C++-Programm, welches zum unoptimierten Maschinencode gehört und kein anderes C++-Programm, welches zu der optimierten Variante gehört.



  • Ist es eigentlich so schwer, mein Posting komplett zu lesen?

    Es geht mir um Demonstrationszwecke! Und es kann ja sein, dass jemand aus genau dem gleichen Grund so ein Tool entwickelt hat - egal wie umständlich das für den "normalen" Einsatz erscheinen mag.



  • Was willst du demonstrieren?



  • manni66 schrieb:

    Was willst du demonstrieren?

    Ganz grob vereinfacht: Dass ein maschineller Optimieralgorithmus insbesondere bei wachsender Komplexität einer Aufgabenstellung einer menschlichen Lösung immer überlegen sein wird.

    Im Detail geht es dann darum, sich anzusehen, was Mensch übersehen hat und was er daraus für zukünftigen Code lernen kann.


  • Mod

    Es gibt keinen Grund, pampig zu werden, weil dir die Antwort "Nein, das gibt es nicht, denn das ist Quatsch aus folgenden Gründen..." nicht gefällt. Das ist nun einmal die faktisch korrekte Antwort. Sollen wir das beschönigen, um dein zartes Gemüt zu schonen?



  • Harstad schrieb:

    manni66 schrieb:

    Was willst du demonstrieren?

    ...
    Im Detail geht es dann darum, sich anzusehen, was Mensch übersehen hat und was er daraus für zukünftigen Code lernen kann.

    Niemand würde etwas daraus lernen (müssen), denn das Tool würde ja auch den zukünftigen (Source)Code optimieren 😕
    Edit:
    Im Source-Code sollte oberste Priorität die Les- und Wartbarkeit haben.



  • Harstad schrieb:

    Im Detail geht es dann darum, sich anzusehen, was Mensch übersehen hat und was er daraus für zukünftigen Code lernen kann.

    Selbst wenn es einen Source2Source-Optimizer gäbe, dann wäre das für den menschlichen Programmierer alles andere als hilfreich. Oder willst du den Programmierern einreden, sie sollen fortan Loops manuell unrollen oder Funktionen manuell inlinen?



  • SeppJ schrieb:

    Es gibt keinen Grund, pampig zu werden, weil dir die Antwort "Nein, das gibt es nicht, denn das ist Quatsch aus folgenden Gründen..." nicht gefällt.

    Na dann arbeite mal an deiner eigenen Ausdrucksweise. Wie heißt es doch so schön? Wie es in den Wald hinein ruft...

    Ansonsten kannst du auch mal über den Unterschied zwischen Qualität und Quantität nachdenken. Einfach auf _jedes_ Posting _irgendwas_ zu antworten, nur damit da was drinter steht, erhöht keinesfalls die Qualität eines Forums.



  • Hi Belli,

    Belli schrieb:

    Im Source-Code sollte oberste Priorität die Les- und Wartbarkeit haben.

    👍
    volle Zustimmung. Was nützt der beste Code wenn man ihn am nächsten Tag nicht mehr versteht, oder wegen Unübersichtlichkeit Fehler macht?
    Die Rechner verfügen heute über so viel Reserven (sowohl Tempo als auch Speicher), das der Unterschied zwischen optimal und nicht so optimal gestaltetem Code meist für den Nutzer gar nicht zu bemerken ist. Wirklich Tempoentscheidend sind immer nur ganz geringe Teile des Codes.
    Die frage, ob ich was inline mache, oder ob ich ne for- oder ne while-Schleife nehme sind eigentlich unbedeutend. Die größte Bremse sitzt immer 30 cm vor dem Bildschirm.
    Und die Sachen, die wirklich Tempo bringen haben meist mit mehr oder weniger optimiertem Sourcecode nichts zu tun. Zum Beispiel, wenn ich über ADO auf eine locale MDB-Datenbank zugreife, dann kann ich meinen Code so sehr optimieren wie ich will, es bringt nichts merkliches. Esrt dann, wenn ich die Cursor-Location von useClient auf useServer umstelle bekommt der Rechner auf einmal den Turbo.
    Das primat ist immer sauber und korrekt zu programmieren. Wegen ein paar Millisekundne Wartezeit wird keiner ein Programm ablehnen, wegen Fehlern aber schon.
    Im übrigen,einfach mal den Scott Myers lesen, da stehen die wichtigsten Tipps zum optimieren schon drin. Und der wird wissen, wieso er es als Buch geschrieben hat und nciht wie er zuerst vorhatte als Programm installiert hat.

    Gruß Mümmel



  • Teilweise gibt es das ja schon,

    - umgekehrt: Stichwort Code Obfuscation
    - Im Sinne des Programmierers: Editoren und IDEs mit verschiedenen "Hilfen".
    - bei Haskell gibt es verschiedene (Lern-) Ansätze wie z.B. HLint
    ( http://community.haskell.org/~ndm/darcs/hlint/hlint.htm )

    Früher gab es sogenannte Peep-Hole-Optimizer (ein pdf (englisch) mit den wichtigsten Stichworten: http://hpac.rwth-aachen.de/teaching/sem-accg-14/Peephole-optimization.pdf )

    Das könnte man - teilweise - auch auf der Codeebene hinbekommen, u.a. mit Mustererkennung, Scripts (das Programm kann nicht immer wissen, worum es inhaltlich geht, und was für Vorlieben bei Programmiertechniken zum Einsatz kommen) und/oder bei ausreichender Standardisierung und eventuell mit einer Datenbank wie bei einem Schachcomputer.

    Aber ob das Programm etwas zu klassischen Frage Hardware vs Algo wissen kann?
    Oder ob das Programm sagen könnte, ob die Dokumentation "stimmt"?

    Oder ob das Programm sagen könnte welches Programm bei der Frage nach Celsius/Fahrenheit-Übersetzern das bessere ist?
    ( https://stackoverflow.com/questions/3217842/c-program-converts-fahrenheit-to-celsius )



  • muemmel schrieb:

    Die frage, ob ich was inline mache, oder ob ich ne for- oder ne while-Schleife nehme sind eigentlich unbedeutend. Die größte Bremse sitzt immer 30 cm vor dem Bildschirm.

    Aha. Was ist mit Systemen, die weder einen Bildschirm noch einen Bediener haben? Die Welt besteht aus mehr als nur aus Trivial-Applikationen auf einemn 08/15-PC.



  • Hi Harstad,

    Harstad schrieb:

    muemmel schrieb:

    Die frage, ob ich was inline mache, oder ob ich ne for- oder ne while-Schleife nehme sind eigentlich unbedeutend. Die größte Bremse sitzt immer 30 cm vor dem Bildschirm.

    Aha. Was ist mit Systemen, die weder einen Bildschirm noch einen Bediener haben? Die Welt besteht aus mehr als nur aus Trivial-Applikationen auf einemn 08/15-PC.

    Die werden meisten von absoluten Profis programmiert, die selber wissen, worauf es ankommt. Im Zweifelsfall ist auch da die Peripherie das limitierende Element.
    Wenn Du irgendwelche Steuerungen programmierst, dann gelten meist ganz andere Bedingungen. Da muss entweder ein Abarbeirtungsschritt in ener bestimmten Anzahl von Maschinentakten abgeschlossen sein, oder es stehen nur begrenzte Speichergrößen zur Verfügung oder andere Bedingungen sind zu beachten. Wie willst Du einem Sourcecodeoptimierer sowas beibringen?
    Gruß Mümmel



  • Harstad schrieb:

    SeppJ schrieb:

    Es gibt keinen Grund, pampig zu werden, weil dir die Antwort "Nein, das gibt es nicht, denn das ist Quatsch aus folgenden Gründen..." nicht gefällt.

    Na dann arbeite mal an deiner eigenen Ausdrucksweise. Wie heißt es doch so schön? Wie es in den Wald hinein ruft...

    Ansonsten kannst du auch mal über den Unterschied zwischen Qualität und Quantität nachdenken. Einfach auf _jedes_ Posting _irgendwas_ zu antworten, nur damit da was drinter steht, erhöht keinesfalls die Qualität eines Forums.

    solche beiträge wie deine erhöhen aber auch keinesfalls die qualität und jemanden anzugreifen der dir helfen will ist auch das letzte, immerhin ist das freiwillig 🙄

    👎

    vll lernst du erstmal wie man ne ordentliche frage formuliert und sein problem schildert! :p



  • Es gibt durchaus auf C++ -> C++-Optimierer. Wie wäre es mit clang-modernize bzw. clang-tidy?

    Als Beispiel https://clang.llvm.org/extra/clang-tidy/checks/modernize-loop-convert.html - das ersetzt z.B. "alte" for-Schleifen durch foreach-Schleifen. Das kann sogar auch neben besserer Lesbarkeit zu höherer Performance führen.

    Aber immer die Limitierungen beachten, z.B. "There are certain situations where the tool may erroneously perform transformations that remove information and change semantics"


  • Mod

    wob schrieb:

    Als Beispiel https://clang.llvm.org/extra/clang-tidy/checks/modernize-loop-convert.html - das ersetzt z.B. "alte" for-Schleifen durch foreach-Schleifen. Das kann sogar auch neben besserer Lesbarkeit zu höherer Performance führen.

    Erste Gedanke: Das kann nicht sein, wenn die Semantik unverändert bleibt.

    Aber immer die Limitierungen beachten, z.B. "There are certain situations where the tool may erroneously perform transformations that remove information and change semantics"

    Oh.

    😃


  • Mod

    SeppJ schrieb:

    wob schrieb:

    Als Beispiel https://clang.llvm.org/extra/clang-tidy/checks/modernize-loop-convert.html - das ersetzt z.B. "alte" for-Schleifen durch foreach-Schleifen. Das kann sogar auch neben besserer Lesbarkeit zu höherer Performance führen.

    Erste Gedanke: Das kann nicht sein, wenn die Semantik unverändert bleibt.

    Aber immer die Limitierungen beachten, z.B. "There are certain situations where the tool may erroneously perform transformations that remove information and change semantics"

    Oh.

    😃

    PS: Das ist die wahre Lektion, die der Threadersteller lehren sollte: Dem Optimierer im Compiler macht man es dadurch einfacher, indem man ganz genau nachdenkt, ob das, was man schreibt, auch wirklich die Semantik hat, die man ausdrücken möchte. Das kann logischerweise kein Programm verbessern, denn ein Programm muss schließlich davon ausgehen, dass der Code so gemeint ist, wie er da steht.



  • Das macht man, indem man sich den vom Compiler generierten Assemblercode für alle performancekritischen Bereiche des Codes anschaut.

    Wenn der Compiler keinen optimales Resultat erzeugen kann, muss man den eigenen Code anpassen. Da hilft es, den verwendeten Compiler gut zu kennen.

    Um aber zu beurteilen, was "optimaler Code" ist, muss man in vielen Fällen über ein ausreichend tiefes Verständnis aktueller CPU-Architekturen verfügen und da hapert es dann meist. Ich bin immer wieder erstaunt, welches naives Verständnis selbst hocherfahrene und lang beruflich tätige Programmierer von diesem Bereich haben und deswegen falsche Überlegungen und Entscheidungen treffen.


Anmelden zum Antworten