Das ist zu oberflächlich. Eine Addition braucht zum Beispiel 1 Takt, Multiply 4-6 Takte, Division bist du bei 30 Takten etwa und sqrt oder Trigonometrische Funktionen sind auch bei mehr als 100 Takten.Pippen123 schrieb:Mein naiver Hingergedanke ist: jeder Befehl kostet Zeit und Ressourcen, d.h. je weniger desto besser
Dann musst du aber auch Bedenken das Memory Load/stores viele Takte brauchen. Wenn man Cache blocking einfügt wird der Code teils deutlich länger aber auch deutlich performanter.
Dann muss man auch schauen was die eine Arch man hat. Inorder vs out of order. Bei GPUs ist es zum Beispiel öfters sinnvoll stumpf alles zu berechnen und das nicht gebrauchte zu verwerfen anstatt mit controll Flow das zu verhindern.
Oft wirst du Recht haben, aber gerade wenn man z.b. drölf Millionen Listen mit jeweils nur 16 Werten sortieren muss, also oft kurze Arbeiten erledigen muss, hat man gut Chancen mit dem eigenen Code schneller zu sein.BeBur schrieb:Das überzeugt mich nicht so richtig, viele Programme bestehen nicht zum überwiegenden Teil aus komplexen oder aufwendigen selbstgebauten Algorithmen. Wer eine Such- oder Sortierfunktion selber implementiert, der macht höchstwahrscheinlich sowieso schon was grundlegend falsch.
Ich würde vermuten, du hast kürzlich AuD im Studium gehört?![]()
Auch sinnvoll ist es wenn man zum Beispiel gewisse Charakteristika eines Problems ausnutzen kann. Z.b. wenn die ersten 5 Elemente die Eigenachaft XY haben, dann sind die nächsten 1Mio schon sortiert.
Das ist halt immer Domänenwissen was sehr hilfreich ist um jede Standardlösung zu schlagen.
Und so kann man viele Beispiele finden. Aber ja, der Großteil des geschriebenen Codes fällt nicht unter solche Fälle.
Moderne Compiler kannst du ganz einfach schlagen. Du musst nur ein Wissen über ein Problem aus seinem Scope schieben. Also z.b. durch verschieben in eine andere Datei oder durch Abhängigkeit von Usereingaben usw usf.BeBur schrieb:Das ist eine etwas seltsame Aussage in mehrerlei Hinsicht. Moderne Compiler wirst du imHo selten schlagen was reine Code-Optimierung angeht. Compiler verkürzen Code darüber hinaus auch nicht (zwangsläufig). Zumindest LLVM transpiled erst in IR vor dem Optimieren, also verkürzt "den code" selber gar nicht. Darüber hinaus schrieben hier ja schon mehrere, dass ein Grund für kompakten Code die Verständlichkeit ist und das hat mit Compilern nichts zu tun.
Man kann z.b. auch den ich recht einfach das Genick brechen so das er nicht mal mehr sieht das eine Funktion nicht mehr als +1 macht.... selbst beim ifort habe ich das gesehen. Und das nicht mal bei dynamischen Linken sondern statisch gelinkt.
Compiler können einfache Beispiele extrem gut lösen. In ner Übungsgruppe hatte nen Compiler zum Beispiel mal gesehen, dass die Berechnung statisch ist und den Wert dann eben zur Compilezeit berechnet. Hat dann 30 Minuten gedauert zu compilieren und der Code war am Ende aber <Faktor 2 schneller als der Code der es wirklich berechnet hat. Aufgefallen ist es, weil uns das Spanisch vorkam und wir sowohl mal die Anzahl instruktionen nachgerechnet haben die nötig sind und die maximal ausgeführt werden konnten in der Zeit und eben uns den Assemblercode am Ende angeschaut haben.
Und damit kommen wir zu nem wichtigen Punkt. Code muss immer angemessen sein und man darf KEIN Pattern stumpf durchziehen. Einmal Code braucht man zu 99% keiner Komplexitätsanalyse unterziehen. Es passiert aber auch mal, dass die grobe Abschätzung 4 Wochen Laufzeit ergibt. Dann muss man sich auch da Gedanken machen.
Pre optimization is the root of all evil. Ja stimmt, aber wenn ich Programm XY neu schreibe weil es zu langsam ist, dann MUSS ich mir vor der ersten Zeile ernsthaft Gedanken über die Datenstruckturen etc machen.
Und so geht es genau weiter. Man sollte aber natürlich nicht wahllos optimieren, es sei denn man weiß wirklich das etwas relevant ist für sie Laufzeit. Man sollte sich aber klar machen, das >95% der Entwickler total auf dem Holzweg bei solchen Einschätzungen sind... man muss das wirklich lernen und immer und immer und immer wieder kontrollieren durch Profiler und eben so Dinge wie roofline model.
Aber das ist immer alles sehr speziell wenn man ehrlich ist. Deswegen immer schauen, dass die Lösung angemessen ist. Ich hasse zum Beispiel mist den tertiären Operator. Oder wenn die Leute ganz fancy Sprachfeatures nutzen. Ich sag nur überladen der mathematischen Operaroren in C++... wenn du nicht mehr weißt was ein + ist, dann wird es extrem häßlich zu verstehen warum und wo ein Code Zeit verbrät und schlecht geschrieben ist.