Neulich in der Kneipe..."Compiler sind die besseren Programmierer"?!

  • Hi zusammen,

    neulich abends beim lecker Bier in der Kneipe kam das Gespräch auf AutoIt vs. Compiler, und einer der Anwesenden (Xorianator) wiederholte sein vorher hier auch schon in der Shoutbox gemachtes Statement, dass Compiler heutzutage Code generieren, welcher (von Menschen) nicht mehr weiter zu verbessern ist.
    Ein weiterer Anwesender (AspirinJunkie) benutzt Compiler und insbesondere hochoptimierte Bibliotheken für weitgehend komplexe mathematische Berechnungen. Diese Bibliotheken/Dll´s werden weltweit als "Standard" eingesetzt, es kann davon ausgegangen werden, dass diese Programme "ausoptimiert" sind.

    Mit AspirinJunkie bin ich einer Meinung, dass bei der Verwendung von standardisierten, hochoptimierten Funktionen aus Bibliotheken, die tausendfach auf Rechenclustern verwendet werden, die Ersteller dieser Bibliotheken schon aus Eigennutz alle Register ihres Könnens gezogen haben, um das letzte Quentchen Leistung aus der verwendeten Hardware herauszukitzeln.

    Allerdings bin ich überhaupt nicht der Meinung, dass ein beliebiger Quellcode, nachdem er durch einen Compiler bearbeitet wurde, "optimal" im Sinne von ausführungstechnisch "schnellstmöglich" zu betrachten ist.
    Bei der Erstellung der o.g. Bibliotheken wird optimiert, indem der vom Compiler erstellte Code analysiert und auf seine mögliche Geschwindigkeitssteigerung durch Sourcecodeumstellung/(Inline)ASM/Intrinsics untersucht wird. Das wiederum erfordert tiefere Kenntnisse der Zielarchitektur und natürlich Verständnis dafür "was der Compiler aus dem Sourcecode macht". Erst jetzt kann man beurteilen, ob der Compiler "gute" Arbeit gemacht hat.

    Interessant fand ich die Aussage, dass ein Compiler den Sourcecode analysiert und, weil die Compilerbauer ja schliesslich am Besten die Zielarchitektur kennen, "automatisch" den besten Code generiert!
    Anders herum gesagt, ein Mensch in Form eines ASM-Programmierers sei im Vergleich zum Compiler maximal "gleich gut".
    Wir brauchen hier nicht über die Vorteile einer HLL zu sprechen, aber dass heutzutage von Professoren im (Informatik-) Studium auf Nachfrage zu ASM mit "Vergessen Sie´s!" geantwortet wird, finde ich höchst bedenklich! Wer anderes als der Programmierer soll denn in der Lage sein, sein "Produkt" in Form von erstelltem Code zu bewerten?! Nicht in den vom Compiler erstellten Code zu schauen und dort ggf. "Fehler" oder bestenfalls Optimierungsmöglichkeiten zu entdecken ist imho doch die totale Ablehnung und Ignoranz eines "normalen" Entwicklungsprozesses!
    In keinem anderen Ingenieurwesen darf die Verifizierung des Ergebnisses und die Bewertung dessen fehlen. Ein Schweißingenieur lässt definitiv seine Nähte röntgen/brechen. Ein Bauingenieur muss einen Nachweis erbringen bzgl. statischer Festigkeit/Stabilität.
    Der "Softwareingenieur" hingegen gibt seinen Code ein, haut auf F5 und der Compiler hat "automatisch" den besten (nicht von Menschen zu verbessernden) Code erstellt?!

    Ja, hier geht es darum, ob Quellcode schreiben und auf F5 hauen "reicht" im Sinne von "es läuft doch" (schnell genug)!
    Ist Programmieren nichts anderes als das zusammenfügen "fertiger" Funktionen/Bibliotheken, und zu denken "es wird so schon passen"?
    Wie programmiert/compiliert ihr? Ist (Code-)Optimierung überflüssig/überbewertet?

  • Super das endlich jemand ein Thread dazu aufgemacht hat.

    Bin ganz deiner Meinung, es wird kaum noch auf Optimierung geachtet weil die Systeme ja mittlerweile schnell genug sind und das sich nicht lohnt.
    Das mag ja vielleicht auch stimmen, besonders wenn man in einer Softwarefirma arbeitet und einem Kunden eine schnelle und vernünftige Lösung präsentieren soll.

    Da habe ich vollstes Verständnis das nicht jeder Programmierer versucht den Code noch um +1.5% (etwas unter-/übertrieben) schneller zu machen oder das das Programm am Ende dann nur 125 MB statt 130 MB RAM schluckt.

    Wenn es aber um langfristige Berechnungen und schnelle Abarbeitung von Aufgaben gehen soll, bei der die Zeit der Programmierung keine so große Rolle spielt, dann lohnt es sich definitiv mal die paar Extrastunden zu investieren um das Programm doch noch ein Stück zu verbessern.

    Ich persönlich versuche immer redundante Zeilen zu vermeiden und nur das nötigste zu erledigen damit ich am Ende nicht sehr viel optimieren muss, weil man beispielsweise für Scripte / Programme die nicht viel können müssen solche Optimierungen absolut nicht notwendig sind.

    Nichtsdestotrotz versuche ich bei komplexeren Aufgaben (die nicht in AutoIt geschrieben sind, sondern z.B. in C#) durchaus meine Software zu verbessern, nicht nur damit sie schneller läuft sondern damit ich nebenbei meinen Stil und Programmierart verbessere.

    Außerdem ist es ziemlich hübsch anzusehen das das Programm mit ein paar kleinen Änderungen um mehrere Prozent schneller läuft. :D

  • dass Compiler heutzutage Code generieren, welcher (von Menschen) nicht mehr weiter zu verbessern ist

    Falsche Tatsache. Dies war nicht meine Aussage. Die korrekte Aussage ist unten zu finden.


    beliebiger Quellcode

    Fehler Nummer eins gefunden: Das war nie Ausgangssituation, geschweige denn Gegenstand der Sache. Es geht um eine große Menge, nicht etwa um "Alle", das würde implizieren dass Aussage 2 natürlich auch so richtig ist.

    Anders herum gesagt, ein Mensch in Form eines ASM-Programmierers sei im Vergleich zum Compiler maximal "gleich gut".

    Eine Aussage, die ich nicht tätigte.

    Compiler hat "automatisch" den besten (nicht von Menschen zu verbessernden) Code erstellt

    Ich weiß wirklich nicht woher du diese Aussagen nimmst, bin aber beeindruckt. Da solltest du jemandem mal auf die Finger hauen.


    Also dann mal loslegen:
    Meine Aussage dazu war, ist und wird bleiben: Wenn du deinen Prozessor kennst, dann produzierst du besseren Code als dein Compiler. Wenn du das nicht tust, dann nicht.
    Um der Aussage mal kurz den Interpretationsfreiraum zu nehmen: Jemand der beschissenen Code produziert kann seinen Prozessor selbstverständlich nicht kennen, sonst würde er nicht so töricht sein und beschissenen Code produzieren.

    Der Grund dafür liegt im Kern dessen, was dein Prozessor dir beim Pipelining abnehmen kann. Angenommen du schaust dir deinen ASM kompilierten Code an und stellst fest, dass ein paar Anweisungen redundant sind "Hä? Warum schiebt er hier ne Anweisung rein die nichts tut?" dann denkst du dir erstmal "Das kann weg."
    Völlig falsch. Das kann eben nicht weg. Du weißt nicht, ob es deiner Pipeline zu Gute kommt, wenn sie einen Takt stallt und dann weiter macht, weil der Compiler bereits erkennt dass sonst ein Hazard auftritt (der mehr Zeit kostet als 1 Takt), oder eben nicht.
    Und das, da würde ich fast drauf wetten, können 99% aller Software Entwickler nicht (mich natürlich eingeschlossen).
    Dazu mal ein kurzer Beitrag von Heise.de - Compilervergleich: Intel vor Microsoft vor GCC.
    Zitat aus dem Artikel: "Verallgemeinert kommt Louel zu dem Ergebnis, dass Intel mit seinem Compiler die Nase vorn hat. Die GCC litten unter anderem daran, dass sich viele ihrer Tuning-Optionen letztlich als unproduktiv erwiesen hätten."
    Genau auf diesen Punkt will ich hinaus.

    Nächstes Beispiel: Loop Unrolling. Man fässt sich an den Kopf, dass eine Datei "etwas" größer wird, aber im Endeffekt greifen wir der Pipeline unter die Arme weil sie einfach alles abarbeiten kann. Macht dein Compiler je nach Bedarf für Einen, man würde aber eine for-to Schleife nicht n-mal kopieren, nur weil es schneller ist.


    Die Frage die sich mir nach den getätigten Aussagen stellt ist, ob hier wirklich einer ernsthafte Absicht einer Diskussion ist. Wenn ja, dann wären 90% der Aussagen im Eingangspost absolut überflüssig, weil sie nichts mit der Aussage per se zu tun haben, sondern eher sind à la "Der Compiler kann aus Scheiße Gold machen". Das ist natürlich kein Gegenstand der Sache, geschweige denn eine Basis auf der man sich unterhalten müsste.


    Wenn es aber um langfristige Berechnungen und schnelle Abarbeitung von Aufgaben gehen soll, bei der die Zeit der Programmierung keine so große Rolle spielt, dann lohnt es sich definitiv mal die paar Extrastunden zu investieren um das Programm doch noch ein Stück zu verbessern.

    Da würde ich fast das präferieren, was Andy vorschlug: HLL (€: Selbstverständlich in die Richtung, sprich:) Warum dann nicht gleich einen eigenen Prozessor entwerfen (angenommen es geht um wirklich spezielle Aufgaben, z.B. Datenbanken)

    redundante Zeilen

    Hmm das ist schön und gut.
    Redundant wäre sowas:
    int i = n;
    i += 2;
    könnte man sich vermutlich an den Kopf fassen. Zwecks Lesbarkeit ist das aber eindeutig besser als die Alternative (das Beispiel ist nicht gut gewählt, verdeutlicht aber den Sachverhalt). Und der Compiler (der gelebte Antichrist) kürzt das sowieso so zusammen, als stünde da "n + 2".

    solche Optimierungen absolut nicht notwendig sind

    Und genau das ist eine beschissene Einstellung. "Ob wir das in 5 oder 6 ms erledigen ist doch egal" ist es eben nicht!
    Wenn man ein Snippet publiziert und sich nur seine Eigenen Eingaben analysiert hat, dann wird man denken "Ja super läuft schnell". Sicher, für genügend kleine Eingaben macht es keinen Unterschied ob 50 oder 60ms, das spürt man nicht mal.
    Dann nutzt aber jemand diese API (oder was auch immer) und stellt fest, dass es Sack langsam ist.
    Gerade im OpenSource Bereich stolpert man viel zu oft über Code, wo man am liebsten heulen würde.


    Wie programmiert/compiliert ihr? Ist (Code-)Optimierung überflüssig/überbewertet?

    Überbewertet nicht, aber mir fehlt das KnowHow um noch weiter zu optimieren.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Und genau das ist eine beschissene Einstellung. "Ob wir das in 5 oder 6 ms erledigen ist doch egal" ist es eben nicht!
    Wenn man ein Snippet publiziert und sich nur seine Eigenen Eingaben analysiert hat, dann wird man denken "Ja super läuft schnell". Sicher, für genügend kleine Eingaben macht es keinen Unterschied ob 50 oder 60ms, das spürt man nicht mal.
    Dann nutzt aber jemand diese API (oder was auch immer) und stellt fest, dass es Sack langsam ist.
    Gerade im OpenSource Bereich stolpert man viel zu oft über Code, wo man am liebsten heulen würde.

    Jetzt unterschlägst du nämlich was. Ich sagte explizit das es für Scripte und Programme ist die nicht viel tun müssen, beispielsweise einfache HotKey-Bindings oder Notifier o. ä.
    Da lohnt es sich absolut nicht, natürlich kann man bis zum Exzess alles rausholen was geht aber das ist bei anderen Projekten wesentlich angebrachter als bei einfachen Sachen.

  • Ich wollte nicht dich direkt kritisieren :D , das war ein bisschen ungünstig ^^ Diese Einstellung pflegen leider viel zu viele Leute bei tatsächlich "wichtigen" Sachen, die dann hochgeladen werden.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Meine Meinung ist, dass ein Compiler nur so gut ist, wie sein Programmierer und somit schließt sich der Kreis wieder.

    Wenn ich ein Programm schreibe und die Exe "schnell" genug arbeitet, dann hat der Compiler seine Arbeit ordentlich erledigt. Für die meisten Fälle trifft das auch zu.
    Begibt man sich z.B. in die "brotlose Kunst" (grafische Datenverarbeitung), so ist noch potential vorhanden den Code mit eigenen Assembler Routinen zu optimieren. Das habe ich gemerkt, wie ich in FreeBasic einiges gebastelt und einige Funktionen direkt in Inline ASM hinzugefügt habe -> mit relativ wenig Aufwand einiges an Performance herausgeholt.

    Ich weiß nicht, ob man den optimalen Compiler bauen kann, der je nach Anwendung den effizientesten Code produziert, aber wird auch nur für spezielle Anwendungen eher nötig sein. Ich kenne mich kaum in Compilerbau aus...

    Abgesehen davon gilt noch das Mooresche Gesetz und warum soll man da noch den Code optimieren denkt sich der eine oder andere Coder!?!

    Wenn ich z.B. mit einer Interpreter Sprache wie AutoIt Applikationen schreiben, die relativ "schnell" arbeiten, dann benötige ich nicht zwingend einen hoch optimierten Code, der einige Millisekunden schneller arbeitet.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich programmiere Folgendermaßen (wenn es schnell sein muss):
    1. Programm quick n Dirty zusammenstricken das die gewünschte Funktionalität zu 100% erfüllt.
    2. Das gleiche Programm nochmal von Grund auf neu schreiben und dabei aus den Fehlern der Vorgängerversion lernen. Außerdem kann man das Problem auch im Kopf wesentlich effizienter lösen, wenn man schonmal ein Programm für diesen Zweck geschrieben hat. Plötzlich sieht man Wege die einem beim ersten Durchlauf nicht einfallen konnten, weil man entweder noch keinen vollständigen Überblick über das Problem hatte, oder noch nicht wusste wie man später mit zwischenzeitlich auftauchenden Daten/Rechnungen verfährt. Das alles lässt sich nun viel effizienter gestalten.
    3. Optimierung von Kleinigkeiten (vorallem, wenn man nicht AutoIt nutzt und Datentypen wichtig sind) wie "ich muss viel zu viel Casten, aber wenn ich irgendwo ganz vorne einen anderen Datentyp benutze muss ich an 5 weiteren Stellen ebenfalls umschalten... usw usw" Da gibt es immer eine kleinst mögliche Anzahl Umwege (kleinst mögliche Anzahl Casts/Funktionsaufrufe/Variablen/Byref oder Byval/usw) die man versucht im Folgenden zu erreichen. (Man sucht also den Code der einen kleinen Problemausschnitt mit weniger Aufwand erledigt als vorher, ohne dabei den input oder output des Ausschnitts anzufassen)
    4. F5
    5. Wenn es wirklich schnell sein muss und man noch nicht zufrieden ist, zurück zu Schritt 3 gehen und etwas herumspielen und schauen was sich dadurch verändert. In vielen Fällen lassen sich da einige Prozente rausholen. (Vorallem muss man für Schritt 3 im Prinzip nichts besonderes können, man "bastelt" ja nur etwas am sowieso vorhandenen Code herum ohne ihn in irgendeiner Weise von der Funktionalität her zu verändern)

    Den fertigen Code schaue ich mir aber meistens nicht an. Dafür hab ich nicht den Nerv und in vielen Fällen auch nicht die Qualifikation.

    In AutoIt ist der Weg zum Tempo relativ einfach: Man nutzt stattdessen ASM :D
    Alle Calls via Pointer aufrufbar machen. Variablen und Arrays in Structs lagern. Schleifen mit vielen Durchgängen durch ASM ersetzen. Fertig. Das macht zwar das "Umfeld" etwas langsamer (Structs sind teils langsam, dabei müssten sie eigentlich schnell sein^^), sofern der Knackpunkt aber eine einfache Stelle ist die man locker umschreiben kann gibts keine Probleme.)

    Allgemein ist auch ganz praktisch: Wer Funktionen wie log, exp, pow, usw benutzt kann (falls Genauigkeit nicht wichtig ist) mit einigen wenigen Grundoperationen jedes Prozessors eine gute Approximation bekommen. Vorallem in InnerLoops haut das richtig rein, wenn man bei pow nicht 10 Schritte (angenommen die Biblipthek die man nutzt hat per default so viele), sondern nur 3 oder so benutzt.

    Das war jetzt nur ganz allgemein. Der Rest wurde schon genannt, ist offensichtlich oder wird noch genannt :D

    lg
    M

  • Wie programmiert/compiliert ihr? Ist (Code-)Optimierung überflüssig/überbewertet?

    Für mich wäre zunächst zu klären wie Code-Optimierung hier zu sehen ist.

    Wenn wir davon reden, ob/wie und in welcher Reihenfolge wir unserem Prozessor die Kommandos geben damit dieser schneller ist bin ich raus.
    Ich habe mich damit noch nie richtig auseinander gesetzt. Ich weiß das es viele Themen in diesem bereich gibt, wie auch beim Speicher...

    Für mich ist Code-Optimierung bislang eine oberflächliche Sache. Mit oberflächlich meine ich an dieser Stelle der Code im Editor. In dem Verbundsstudium an dem ich kurzzeitig teilgenommen habe war Code-Optimierung folgendes:
    - Keine unnötigen doppelten Funktionen nutzen. Beispiel.: Keine Funktionen in Schleifen-Header verwenden wie z.B. UBound. Wenn wir uns das Ergebnis vorher in einer Variable speichern brauchen wir zwar mehr Speicher aber rufen dafür nicht in jedem Durchlauf die Funktion auf.
    - Kommentare. Code ist immer nur so gut wie seine Kommentierung. Keine Kommentare, kein guter Code.
    - Variablen sorgsam nutzen um des Speicher willens.
    - Variablen deklarieren, initialisieren und später entsprechend "leeren".
    - Lösungswege so einfach wie möglich zu gestalten.Beispiel: Wenn ich in einer Schleife eine Ausgabe mache und jede 2te Zeile anders färben/leer lassen will kann ich dies auf x-Wegen tun. Eine Variable nehmen und deren Status wechseln true/false oder ich rufe jedesmal Mod auf und werte entsprechende Ergebnisse aus oder schreibe entsprechende If-Anweisungen. Hier würde ich z.B. die einfache If-Abfrage der Mod-Funktion vorziehen.

    Zu der Frage: Wie programmiert/compiliert ihr?
    Ich habe bereits vor dem Studium schon sehr energisch auf diese Dinge geachtet, da dies für mich persönlich qualitative Software ausmacht. Ich programmiere aktuell ausschließlich beruflich und nicht noch zusätzlich zu Haus in meiner Freizeit. Da die Praxis oft von der Theorie abweicht und es in der Firma niemanden interessiert wie ich programmiere, solange es funktioniert und tut was es soll, halte ich mich an meinen "oberflächlichen" Optimierungen und vernachlässige die tiefere Ebene von der Andy und Xorianator in den Start-Posts reden, und selbst das ist teilweise aufgrund von Zeitmangel sehr schwierig. Kompilieren: F5.

    Ich möchte nicht meine Hand ins Feuer legen ob oder ob nicht, meine "Optimierung" Einfluss auf die tiefere Ebene hat, dass weiß ich wie gesagt nicht. Ich sehe für mich persönlich (besonders in der heutigen Zeit) keinen Grund mich in diese Thematiken einzuarbeiten, was für mich jedoch am Einsatzbereich liegt. Wenn ich Hardware-nah Maschinen programmieren würde, wäre das anders. Mach ich aber nicht ... keinen Grund haben ist jedoch was anderes als es als überflüssig zu bewerten.

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    Beispiel.: Keine Funktionen in Schleifen-Header verwenden wie z.B. UBound. Wenn wir uns das Ergebnis vorher in einer Variable speichern brauchen wir zwar mehr Speicher aber rufen dafür nicht in jedem Durchlauf die Funktion auf.

    Hmm...dafür sah ich bisher keine Notwendigkeit, weil ich davon ausgegangen bin, dass der Compiler/Interpreter sowas sowieso in einer Konstanten ablegt.
    Mal testen:


    Die Ergebnisse schwanken im zweiten Nachkommabereich:

    Code
    mit Ubound (ms):  2.84083678003
    ohne Ubound (ms): 2.83059689462309
    
    
    mit Ubound (ms):  2.86014627822588
    ohne Ubound (ms): 2.88238145796659


    Im Rahmen der Messgenauigkeit würde ich sagen: Unentschieden.
    Das bestätigt eher meine Theorie (Compiler-/Interpreterarbeit) von oben.

  • Wenn du deinen Prozessor kennst, dann produzierst du besseren Code als dein Compiler. Wenn du das nicht tust, dann nicht.
    Um der Aussage mal kurz den Interpretationsfreiraum zu nehmen: Jemand der beschissenen Code produziert kann seinen Prozessor selbstverständlich nicht kennen, sonst würde er nicht so töricht sein und beschissenen Code produzieren.

    Aha, DAS ist ja extremst interessant! Der Grund eine HLL zu verwenden ist doch "menschlichere" Lesbarkeit des Codes und vor allem Portabilität, das wird irgendwann in jeder Diskussion zwischen (Pseudo) Quiiieeek-in_die_Enge_getriebene-HLL-Anwender und den (ASM)-Optimierern postuliert. Mal abgesehen davon, dass nur ein Bruchteil sämtlicher Programme wirklich portabel IST, besteht doch genau hier das Problem.
    Wie kann ich denn mit dem GLEICHEN Sourcecode auf unterschiedlichen Plattformen sichergestellt das "optimale" Ergebnis herausholen?! Das funktioniert doch nur, wenn der Compiler den Sourcecode individuell für die zu verwendete Plattform ausarbeiten kann. Wenn allerdings der Compiler (infolge ca. 15-20 Jahre Rückstand auf die Hardware) besonders "schnelle" Prozessorfeatures garnicht ansprechen kann, schlägt die Stunde der Intrinsics() !
    Und das wiederum ist gaaaanz großes Kino, denn diese Intrinsics sind nichts weiter als ein Wrapper für Inline-ASM!


    Was heisst das für den Programmierer? Er weiß um die unzulänglichkeiten des Compilers und benutzt Instrincs (somit ASM). Jetzt wird es interessant, denn WELCHER Programmierer weiß um die Unzulänglichkeiten des Compilers und nutzt Intrinsics? Derjenige, der entweder WEIß, dass der Compiler keine "schnellen" Befehle verarbeitet (woher weiß er das?), oder dies eben durch Analyse des compilierten Codes herausgefunden hat!
    Vielleicht hat er auch durch Weiterbildung/Kollegen/Freunde/Internet/Forenbeiträgen(wie diesem ^^) von Intrinsics gehört/gelesen und wendet diese Techniken an, um die Laufgeschwindigkeit seines Codes um Faktor 3-4 zu erhöhen!

    Und jetzt zum "beschissenen Code". Wie definiert man diesen? Und wie findet man den Unterschied zum besseren/guten/optimalen Code? Wenn ich weiß, dass mein Prozessor bestimmte Codesequenzen nur unzulänglich abarbeitet, aber die Erstellung dieses Codes kaum Zeit kostet, wen juckt das dann? Ich mache das schon seit Jahren so, gelernt ist schliesslich gelernt! Wenn mein Code serienweise Prozessorstalls, Cache-Misses und Abhängigkeiten in den diversen Prozessorpipelines verursacht, dann muss ich das doch erstmal wissen! In das Compilat gucken hilft da jedenfalls nicht....Und übrigens hahahaha, diese Sequenz kann nach Codeumstellung 3x schneller laufen, diese Märchenerzähler immer, die sollen das erstmal beweisen 111elf!!
    Jetzt kommts dicke, ich schreibe diesen "beschi****" Code in Funktionen, welche auch noch meine Kollegen benutzen, dann wird der Mist auch noch flächendeckend verteilt! Von denen ist auch jeder heilfroh, besser C&P als mühsam selbstgeschrieben! Von wegen optimieren, das soll man für 11 Euro die Stunde wohl auch noch machen, IHR HABT SIE WOHL NICHT MEHR ALLE! :ironie: (<--für diejenigen, die mich NICHT kennen 8o )

    Allgemein ist auch ganz praktisch: Wer Funktionen wie log, exp, pow, usw benutzt kann (falls Genauigkeit nicht wichtig ist) mit einigen wenigen Grundoperationen jedes Prozessors eine gute Approximation bekommen. Vorallem in InnerLoops haut das richtig rein, wenn man bei pow nicht 10 Schritte (angenommen die Biblipthek die man nutzt hat per default so viele), sondern nur 3 oder so benutzt.

    Dazu nur einen Link.... Tutorial AutoIt und Assembler UPDATE 24. Oktober 2010 Verwendung von Autoitvariablen im Assemblercode
    Dabei ist die Programmiersprache völlig uninteressant, in bspw. C(++) bzw. bei anderen Compilersprachen wäre das ganz genauso gewesen. Aber genau DAS findet man nicht mit F5 drücken, FETTIIIIICH, heraus! Btw. gibt es in vielen Programmiersprachen "schnelle" Varianten von float/double/semi-float usw...

    Da die Praxis oft von der Theorie abweicht und es in der Firma niemanden interessiert wie ich programmiere, solange es funktioniert und tut was es soll, halte ich mich an meinen "oberflächlichen" Optimierungen und vernachlässige die tiefere Ebene von der Andy und Xorianator in den Start-Posts reden, und selbst das ist teilweise aufgrund von Zeitmangel sehr schwierig. Kompilieren: F5.

    Dem ist nichts mehr hinzuzufügen. :thumbup:

  • Sehr schöne Beiträge.....
    Kann es sein, dass man hier den USER nicht beachtet? Ich lese schöner Code und denke was ist schön? Ein schönes Muster im Editor?

    Schöner Code ist wenn er:

    1) Funktioniert
    2) Auch nach 2 Monaten noch verstanden wird
    3) Im Rahmen der Aufgabenstellung schnell genug ist. Ob etwas 60 oder 100ms dauert macht keinen Sinn. Wenn es eine Schleife ist, die 500.000 durchlaufen wird, bekommt die Differenz Gewicht.
    4) Wer nicht nur zum Spass programiert muss auch wirtschaftlich denken. Programme müssen/sollen bezahlbar bleiben?

    Ja ein wenig Disziplin muss sein nur weil CPUs immer schneller, speicher immer mehr wird muss mann nicht wie im Kindergarten programieren - aber übertreiben muss man es auch nicht?


    Worüber hier keiner spricht ist die Usability. Ich finde es macht mehr Sinn Zeit und Aufwand in die Bedienbarkeit zu stecken als das letzte Quentchen optimieren zu wollen.

    Ja schon klar, das geht am rein wissenschaftlichem Ansatz vorbei....


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich habe hier in der Diskussion eigentlich nichts zu suchen. Aber @Peter S. Taler, das ist Fachsimpelei von Leuten mit Ahnung und Spaß daran.

    Denen geht es hier nicht um ein akzeptabel laufendes Programm mit verständlicher API oder intuitiver GUI.. Die wollen mehr ;)

    Grüße autoiter

  • @autoiter -- > Das war mir schon klar.

    Aber schau, genau da liegt ja der "Hund" begraben, oft fragt man sich welches Genie das geschrieben hat - weil es wirklich gut ist - nur bedienen läßt es sich schlecht - da feht dann eben auch etwas.


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Aber schau, genau da liegt ja der "Hund" begraben, oft fragt man sich welches Genie das geschrieben hat - weil es wirklich gut ist - nur bedienen läßt es sich schlecht - da feht dann eben auch etwas.

    Richtig, aber was hat das mit "der Arbeit" eines Compilers zu tun? Nichts! Usability optimieren hat absolut nichts mit der verwendeten Programmiersprache/Maschine zu tun.
    Abgesehen davon stelle ich bei täglichen Anwendungen fest, dass oft der Programmierer/Entwickler NICHTS mit dem fertigen Produkt zu tun hat, daraus ergeben sich teilweise haarsträubende Unzulänglichkeiten in der Bedienung.
    Ich halte jede Wette, dass die meisten Entwickler (nicht nur im Bereich Software) in der Folgegeneration wesentlich "bessere" Produkte erschaffen würden, wenn sie gezwungen wären, einige Wochen mit ihrem "Mist" tagtäglich stundenlang zu arbeiten!

    als das letzte Quentchen optimieren zu wollen.

    Du hast es nicht verstanden...hier geht es nicht ums "wollen", sondern darum, es zu können. Können im Sinn von analysieren, Lösung erarbeiten und diese umzusetzen. Wenn suggeriert wird, dass ein Gerät "automatisch" das beste Ergebnis erzielt, egal welchen Schrott ich hineinstecke, dann stumpft der Anwender/Bediener natürlich ab...
    Umso mehr, wenn er nicht einmal die Möglichkeit erhält, das Ergebnis zu bewerten (bewerten zu KÖNNEN)


    //EDIT
    Soeben eine Stellenanzeige für Softwareentwickler in einem Unternehmen gelesen, in welchem seit Generationen höchstwertige Fotoapparate/Linsensysteme/Mikroskope/Laborgeräte hergestellt werden. Es werden in vier Bereichen "Software-Typen" gesucht:
    - Softwaretester zur nachhaltigen (!) Qualitätsverbesserung,
    - Entwickler (von der Anforderungsanalyse über Design bis zur Implementierung)
    - Entwickler Firmware (selbstständig (!) neue Technologien zur Produktreife bringen)
    - Entwickler Bildverarbeitung und -analyse (entwickelt PERFORMANTE (!) Algorithmen unter zuhilfenahme GPU-basierender Methoden wie CUDA und OpenCL)

    ALLES, aber auch alles in dieser ganzseitigen Anzeige in einer Fachzeitschrift schreit geradezu nach "Optimierern" bzw. Anwendern und Verwendern der neuesten Hard- und Softwaretechnologien.
    Diese Stellen werden definitiv von Leuten besetzt werden, die nachweislich "optimieren" können, und diesen Vorgang nicht mit "...aber ich hab doch ganz feste F5 gedrückt..." beschreiben.

  • ALLES, aber auch alles in dieser ganzseitigen Anzeige in einer Fachzeitschrift schreit geradezu nach "Optimierern"

    Was auch nicht ganz unverständlich ist bei Ansicht der Marktlage. Die IT Branche ist aktuell so überlaufen, dass fast jeder die Chance hat dort einen Job zu kriegen. Im Vergleich zum EInzelhandel o.ä. ist die Bezahlung dazu höher. Also hat man auch mehr qualifizierte Nieten in der Branche.

    Ich hatte Leute in meiner Ausbildung in der Klasse die nur einen Hauptschulabschluss hatten, und dann beim Onkel in der Firma angestellt werden. Die haben keine einzige noch so einfache Aufgabe pünktlich gelöst, immer mit Wochen und Monaten (ein mal sogar ein halbes Jahr) Verspätung...toll ausgesehen hat es, haben das Webdesign 100% nach Google Richtlinien erstellt. Die Funktionen zur Verarbeitung der Daten haben dennoch nicht zu 30% das getan was Sie sollten.
    Das waren quasi zwei Spezialisten für Anwendungen die vorne Hui und hinten Pfui sind.

    Grüße Yaerox

    Grüne Hölle

  • @ Andy
    Sorry - aber ich habe durchaus verstanden worum es geht.
    Nur kommt mir der Ansatz quer vor. Etwas zu tun - weil man es kann - macht es nicht immer sinnvoller. Nach meiner Auffassung gäb es im Softwarebereich größere "Baustellen" als den Code auf Teufel komm raus zu optimieren.

    Im übrigen steht dieser Beitrag doch unter Talk und nicht unter "alle sprechen über das gleiche und sind einer Meinung"? Sonst mußt Du das darüberschreiben.


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Bitte erlaubt mir als alter Gärtner ein "offtopic" Zitat:

    Zitat von Bazii

    Lass' die Säge sägen aber gönn' dem Baum den Ast
    und wenn Du wenig Ahnung von den Dingen hast
    versuch' mit langem Abstand und mit großer Weile
    verzag' der scharfen Säge und der gut gemeinten Eile

    Wer mein Zitat nicht kapiert hat, soll dazu 'bitte' keine Stellung nehmen. Und wer es kapiert hat, soll es bitte auch nicht tun. :theke:

  • Der Punkt ist nicht, dass man jedes Programm auf Teufel komm raus optimieren muss. Vielmehr geht es darum, dass z.B. an der Uni/FHS gelehrt wird, dass diese Optimierungsmöglichkeiten komplett vernachlässigbar sind. Resultat ist ein Informatiker, der noch nicht mal genau weiß, was der Compiler mit dem eigenen Code anstellt.

    Klar, man braucht heutzutage kaum noch ausführliche Kenntnisse in Assembler. Ein Webprogrammierer z.B. überhaupt nicht. Wenn ich aber an der Uni nur Java lehre und sage, dass alles auf einer tieferen Abstraktionsschicht "veraltet und unwichtig" ist... Dann hat der angehende Softwareentwickler ja noch nicht mal die Möglichkeit, sein Programm auf dieser Ebene zu optimieren, völlig egal, ob es nötig ist oder nicht! Pauschal auf solche Grundlagen zu verzichten halte ich auch für falsch.

    Man muss dabei sagen, dass das auf mich nicht zutrifft. Ich studiere keine "normale" Informatik, sondern Ingenieur-Informatik. In den ersten beiden Semestern gibt es Java/OOP, danach kommt Mikroprozessortechnik etc. mit C und Assembler. Der Großteil der Informatik-Studenten kommt allerdings nicht über Java hinaus.

  • @bazii, du machst deinem Namen alle Ehre! Und btw., wenn es damals in der Schule nach den Eignungstests gegangen wäre, hätte ich Gärtner als "optimal für mich geeigneten" Beruf lernen sollen...
    Den "grünen Daumen" hab ich jedenfalls, aber das reicht offensichtlich nicht ;)


    Der Großteil der Informatik-Studenten kommt allerdings nicht über Java hinaus.

    Was sich imho mit

    Also hat man auch mehr qualifizierte Nieten in der Branche.

    deckt....bitte nicht falsch verstehen, es gibt werweißwieviele TOP-Java-Programmierer. Und die haben einen gigantischen Vorteil gegenüber den "hardwarenahen" Sprachen, denn dort ist es Sache der Java-Implementation auf dem einzelnen/bestimmten Gerät, welches u.a. die Geschwindigkeit des Codes beeinflusst. Denn dem Java-Programmierer kann es völlig schnuppe sein, ob sein Code auf einer Armbanduhr/Kaffee- oder Spülmaschine oder in einem KFZ läuft!


    Nach meiner Auffassung gäb es im Softwarebereich größere "Baustellen" als den Code auf Teufel komm raus zu optimieren.

    Mach dazu einen Thread auf und sprich diese "Baustellen" an. Dazu ist ein Forum da. In diesem Thread ist die Baustelle "Compiler - reicht der Hieb auf F5 um optimalen Code zu erzeugen?!".


    In den ersten beiden Semestern gibt es Java/OOP, danach kommt Mikroprozessortechnik etc. mit C und Assembler.

    :klatschen: hehe, die Microprozessortechnik hat mich erstmal mit C(++) warm werden lassen 8o . Und um OpenCL-Kernel (nicht den restlichen Code, nur den Kernel!) habe ich mich ja auch schon bemüht, der besteht aus (Ansi)-C aus dem vorherigen Jahrhundert :thumbup: .
    Aber mittlerweile sind die Compiler auch für die Mikroprozessoren am Limit angelangt, da hat selbst ein ASM-Spezialist noch weniger Chancen auf "Optimierung", weder in der Geschwindigkeit, noch in der Größe. Klar eigentlich, der simple und einfache Prozessor hat einen sehr begrenzten Befehlssatz und die Compilerbauer hatten in den vergangenen Jahren genug Zeit, den reichlich vorhandenen hochperformanten ASM-Code passend umzusetzen. So kann es gehen, gerade bei einem "hardwarenahen" Programmieren wirst du von den Spezialisten (alles selbst alte ASM-Hasen) gefragt, ob du noch alle Latten am Zaun hast, wenn du ASM programmierst statt den "bequemen" (und wie gesagt ausoptimierten) Compiler zu benutzen!