Was hat ihr schon optimiert?
-
Ich habe eine paar crypto Algorithmen implementiert (SHA-2, Keccak, Chacha20, etc.) und es ist schon erstaunlich wie viel performance man bekommt indem man einfach nur manuell (oder durch template-rekursion ;)) loops unrolled, und indem man viele einzelne Variablen statt Arrays benutzt. Man wuerde denken sowas einfaches koennten Compiler mittlerweile selbststaendig, aber nope. Jedenfalls nicht VS und g++. (Auch nicht mit inline everything & favor fast code etc.) Clang teste ich vielleicht irgendwann mal. Dafuer wird memcpy einfach zu einer instruction weg optimiert, guter weg um alignment und strict aliasing Problemen aus dem Weg zu gehen.
-
Gregor schrieb:
volkard schrieb:
Bessere Mathe: 10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000%Besserer Algo: 1000000000000000000000000000000000%
Was ist für Dich der Unterschied zwischen besserer Mathe und einem besseren Algorithmus?
Würde mich auch interessieren.
-
Cpp_Junky schrieb:
Erfolgstipp: Man kann das Optimierungs-Ergebnis um ein vielfaches verbessern wenn man die ursprüngliche Lösung besonders schlecht programmiert! So konnte ich bereits Verbesserungen von mehreren 1000% erreichen
QFT!
-
cooky451 schrieb:
und indem man viele einzelne Variablen statt Arrays benutzt. Man wuerde denken sowas einfaches koennten Compiler mittlerweile selbststaendig, aber nope. Jedenfalls nicht VS und g++. (Auch nicht mit inline everything & favor fast code etc.)
Ich hab ne Theorie was der Grund sein könnte dass weder VS noch GCC das optimieren können. Zeig den Code her, dann kann ich gucken ob die Theorie aufgeht.
-
Sowas kann auch Spass machen. Es ist ein tolles Gefühl, wenn man nach Jahren endlich eine primitive stümperhafte Implementierung ersetzen kann, die so tief drinnen war, dass niemand sich getraut hatte, sie zu ersetzen, und man dabei das Programm um Größenordnungen beschleunigt.
-
cooky451 schrieb:
Ich habe eine paar crypto Algorithmen implementiert (SHA-2, Keccak, Chacha20, etc.) und es ist schon erstaunlich wie viel performance man bekommt indem man einfach nur manuell (oder durch template-rekursion ;)) loops unrolled, und indem man viele einzelne Variablen statt Arrays benutzt.
Wieviel Prozent sind viel?
-
CRC32 Berechnung von C++ nach ASM -> Faktor 6 schneller. Aber wahrscheinlich auch nur deshalb, weil die Compileroptimierungen nicht eingeschaltet sein durften (Vorschrift).
-
Cpp_Junky schrieb:
Erfolgstipp: Man kann das Optimierungs-Ergebnis um ein vielfaches verbessern wenn man die ursprüngliche Lösung besonders schlecht programmiert! So konnte ich bereits Verbesserungen von mehreren 1000% erreichen
dito, hab mal eine CRC Berechnung für Dateien in C# verbessert. Der Ursprungscode hat Byte für Byte eingelesen und das dauerte bei großen Dateien recht lange. Nach Änderung auf Einlesen in jeweils 4KB Blöcke und darauf die CRC Berechnung ist nun überhaupt keine Berechnungszeit mehr wahrzunehmen.
-
Ich habe schon viele Demos und Intros optimiert. Wird im schlimmsten Fall ein paar % langsamer, aber was tut man nicht um die letzten paar Bytes auszunutzen (http://www.pouet.net/prod.php?which=66062 ;-).
-
Ich habe momentan gerade das Vergnügen, einen lang laufenden Prozess (Grössenordnung von Stunden), der auf Web Services zugreifen muss, zu optimieren. Das Problem hierbei sind die vielen Requests, welche bisher einzeln abgesetzt werden. An vielen Stellen kann man vermutlich Bulk Processing betreiben. An anderen Stellen werden viele Daten rumgeschoben, welche gar nie gebraucht werden (liegt am bequemen Programmiermodell).
Burkhi schrieb:
CRC32 Berechnung von C++ nach ASM -> Faktor 6 schneller. Aber wahrscheinlich auch nur deshalb, weil die Compileroptimierungen nicht eingeschaltet sein durften (Vorschrift).
*kopfschüttel*
-
Gregor schrieb:
volkard schrieb:
Bessere Mathe: 10000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000%Besserer Algo: 1000000000000000000000000000000000%
Was ist für Dich der Unterschied zwischen besserer Mathe und einem besseren Algorithmus?
Ihr habt doch genug bei den Primzahlenthreads von unserem EH mitgelesen, also stellt Euch nicht doof.
Es gibt da etliche Optimierungen, die rein mit den Eigenschaften der Zahlen zu tun haben, wie daß man keine ungeraden Teiler testen muss (klappt nur bei Primzahlen, was unser Forschungsgegenstand dort ist).
Und es gibt etliche Optimierungen, denen vollkommen egal ist, was man sucht, wie memoization (klappt auch bei std::strings und Großmüttern, sogar bei Elefanten).Klar entschwuppt der Unterschied, wenn man beide Richtungen ausgeschöpf. Praktische Mathematik oder theoretische Informatik? In der Sache kein Unterschied, allein, welches Institut das Gehalt zahlt, des Fachrichtung steht auf dem Paper.
-
@volkard
Also mehr als eine schemenhafte Vorstellung wie du die Unterscheidung triffst hab ich jetzt auch nicht. Ist aber immerhin schon mehr als gar keine Ahnung
-
hustbaer schrieb:
@volkard
Also mehr als eine schemenhafte Vorstellung wie du die Unterscheidung triffst hab ich jetzt auch nicht. Ist aber immerhin schon mehr als gar keine AhnungGeht mir ähnlich. Vielleicht kann man das so unterscheiden:
Bessere Mathe = Erkennen, was für eine Problemstellung man eigentlich hat. Vor allem hat man es vielleicht mit einem Spezialfall zu tun, mit dem man viel leichter umgehen kann. Wenn einem bestimmte Eigenschaften von Problemstellungen klar werden, dann kann das ganz neue Möglichkeiten eröffnen.
Besserer Algo = Umstellung auf den besten Algorithmus für die jeweilige Problemstellung. Also von "naiv implementiert" zu "gut recherchiert / gut erdacht", aber ohne eine Neuklassifikation der Problemstellung.