Sourcecode optimieren



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



  • Harstad schrieb:

    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!

    Du kannst dir statische Codeanalyse Tools ansehen. Open Source ist da cppcheck zu nennen, kommerziell zum Beispiel Coverity. Wunder darf man sich davon nicht erwarten.

    Ansonsten schau dir z.B. http://www.agner.org/optimize/optimizing_cpp.pdf an.

    Ein Tipp aus meiner praktischen Erfahrung: am ehesten kann man Performance durch bessere Algorithmen bzw. Datenstrukturen rausholen. Z.B.: Langsame lineare Suche -> ersetzen durch binäre Suche.
    Oft aber helfen auch ganz banale Dinge. Eine Datei komplett in den Speicher zu laden statt Zeile für Zeile aus der Datei zu lesen.



  • muemmel schrieb:

    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.

    Und wo denkst du, kommen diese Profis her? Die fallen auch nicht vom Himmel...und für genau diesen Lernprozess hätte ich so ein Tool gesucht. Aber ist schon OK, in diesem Forum befasst man sich lieber mit Besserwisserei als mit der eigentlichen Fragestellung...


  • Mod

    Harstad schrieb:

    muemmel schrieb:

    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.

    Und wo denkst du, kommen diese Profis her? Die fallen auch nicht vom Himmel...und für genau diesen Lernprozess hätte ich so ein Tool gesucht. Aber ist schon OK, in diesem Forum befasst man sich lieber mit Besserwisserei als mit der eigentlichen Fragestellung...

    Die Fragestellung ist seit dem zweiten Beitrag im Thread beantwortet. Du ignorierst es bloß, weil dir nicht passt, dass die Antwort "Gibt es nicht" ist. Der Rest dreht sich natürlich um deine Reaktion, denn die ist äußerst unhöflich, weil du Erklärungen, warum es das nicht gibt, als persönlichen Angriff auf dich selber auffasst.

    Auch hier in diesem Beitrag: Warum musst du muemmel so doof angehen? Er hat dir erklärt, dass das keine Maschine machen kann und du fährst ihn an, dass du gerne eine Maschine hättest, die einen Menschen lehrt. Was soll das?



  • Ich finde, dass clang-tidy eben doch sowas kann.

    Gut, als Beispiel hatte ich jetzt eines gewählt, bei dem man einstellen kann, wie "sicher" die Konvertierung sein soll. Aber nehmen wir doch andere Beispiele, man kann die unsicheren Dinge ja ausschalten oder dann nur als sinnvolle Hinweise nehmen, die man manuell nachschauen kann.

    Wie wäre es mit

    http://clang.llvm.org/extra/clang-tidy/checks/misc-string-compare.html

    Das gibt doch deutlich genug einen Hinweis, was hier im Quellcode falsch ist und wie es besser geht.

    Oder wie wäre es mit http://clang.llvm.org/extra/clang-tidy/checks/modernize-use-override.html, dem automatischen Hinzufügen von override? Das optimiert die Lesbarkeit des Quellcodes und ändert sicher nichts am Programm. Damit sind doch die Kriterien des OP erfüllt und dein "gibt es nicht" ist widerlegt.


Anmelden zum Antworten