Was ist wirklich langsam?



  • Bashar schrieb:

    Ich hab mal ein Matlabscript um 2 Größenordnungen beschleunigt, das war schon was 🙂 Von 1 Stunde auf <1 Minute.

    Also von Schleifen-Matlab auf Matlab umgeschrieben? 😉

    Ich hab schon öfters (kleinere) Simulink-Simulationen entweder als reinen (und ordentlichen) Matlab-Code oder gleich als Mex-Funktion umgeschrieben. Da holt man sehr leicht Faktor 50-100 raus. Lohnt sich dann schon wenn man die Dinger mehrere hundert/tausend mal durchsimuliert.



  • Von elendslangsamen Datenbank dazu uebergegangen, die Daten von Hand zu parsen. Parser in C++ geschrieben, Rest des Programms in R gelassen. Ausfuehrungszeit ging von ~6 Tagen runter auf knapp 12 Stunden 🙂

    EDIT: Daten dann nochmal umzurechnen und in Binaerformat abzuspeichern brachte nochmal Faktor 10



  • hustbaer schrieb:

    Algorithmen mit Integration trimmen. Kannst du das nochmal auf verständlich schreiben?

    Naturwissenschaftlern und Ingenieueren ist das hinreichend verständlich. Oft sind Aufgaben nicht durch eine feste Formel oder durch ein einfaches lineares Gleichungssystem genau genug lösbar. Dann braucht man eine 'Schrittweise Annäherung = Iteration' mit einem bekannten Kriterium für die Genauigkeit einer Zielgrösse (Konvergenzkriterium).

    Stelle dir vor, du brauchst für jeden einzelnen Iterationsschritt ein grösseres lineares Gleichungssystem (z.B. 1000 x 1000). Dessen Lösung braucht Rechenzeit. Es kommt also entscheidend darauf an, wieviele Iterationsschritte man bis zum Ziel benöntigt (10 oder gar 1000). Das Finden einer passenden Startbedingung und die Verbesserung bei jedem neuen Iterationsschritt sind dann das 'Trimmen des Algorithmus', um die Anzahl der erforderlichen Iterationen möglichst gering zu halten.



  • berniebutt schrieb:

    hustbaer schrieb:

    Algorithmen mit Integration trimmen. Kannst du das nochmal auf verständlich schreiben?

    Naturwissenschaftlern und Ingenieueren ist das hinreichend verständlich.[Schnipp]

    Du hast eine seltsam umständliche Art, "Sorry, ich meinte Iteration, nicht Integration" zu sagen.



  • berniebutt schrieb:

    hustbaer schrieb:

    Algorithmen mit Integration trimmen. Kannst du das nochmal auf verständlich schreiben?

    Naturwissenschaftlern und Ingenieueren ist das hinreichend verständlich.

    Nein.

    Der Rest deines Posts liest sich wie "den richtigen Algorithmus für das Problem verwenden". Obwohl diese Aussage relativ trivial anmutet, muss man sie doch als Korrekt anerkennen.



  • @Bashar: Richtig, ich hatte Iteration nicht Integration gemeint! War ein fataler Lapsus.
    @otze: So trivial mit dem richtigen Algorithmus ist das auch nicht. Selbst wenn er stimmt kann man durch unnötige Dinge noch viel unnütze Rechenzeit verbraten.

    Fazit: Optimierungen lohnen nur, wenn es deutlich um Rechenzeit geht. Den Kleinkram kann man getrost dem intelligenten Compiler überlassen. Den Anwender interessiert es nicht, ob er für ein Ergebnis z.B. 200 Millisekunden statt vieleicht erreichbare 100 Millisekunden auf ein Ergebnis wartet. Oder man kitzelt den Zeitgewinn mit viel Aufwand selbst heraus. Also meine Meinung: Alle Bemühungen zur Optimierung nur dort ansetzen, wo es richtig etwas bringen kann. Und das sind nun einmal oft durchlaufene Programmstellen (Schleifen aller Art), Lösungsalgorithmen, und wie zitiert Zugriffe auf eine Datenbank.

    Leider kann man ein Programm durch Ölen wie ein Fahrrad selbst nicht schneller machen. 🙄



  • berniebutt schrieb:

    Den Anwender interessiert es nicht, ob er für ein Ergebnis z.B. 200 Millisekunden statt vieleicht erreichbare 100 Millisekunden auf ein Ergebnis wartet.

    Wenn der "Anwender" ein 100ms-Task ist schon 😉



  • berniebutt schrieb:

    4. Zeigerarithmetik nutzen

    Das ist doch eher schlecht wegen des möglichen aliasing.



  • 100 Millisekunden

    könnten übrigens 10 fps (frames per second) ermöglichen 🙂





  • berniebutt schrieb:

    @Bashar: Richtig, ich hatte Iteration nicht Integration gemeint! War ein fataler Lapsus.
    @otze: So trivial mit dem richtigen Algorithmus ist das auch nicht. Selbst wenn er stimmt kann man durch unnötige Dinge noch viel unnütze Rechenzeit verbraten.

    Fazit: Optimierungen lohnen nur, wenn es deutlich um Rechenzeit geht. Den Kleinkram kann man getrost dem intelligenten Compiler überlassen. Den Anwender interessiert es nicht, ob er für ein Ergebnis z.B. 200 Millisekunden statt vieleicht erreichbare 100 Millisekunden auf ein Ergebnis wartet. Oder man kitzelt den Zeitgewinn mit viel Aufwand selbst heraus. Also meine Meinung: Alle Bemühungen zur Optimierung nur dort ansetzen, wo es richtig etwas bringen kann. Und das sind nun einmal oft durchlaufene Programmstellen (Schleifen aller Art), Lösungsalgorithmen, und wie zitiert Zugriffe auf eine Datenbank.

    100 Millisekunden später kann schon mal ein paar millionen Euro ausmachen, wenn es um Tradingsysteme geht. Gerade als C++-Programmierer hat man häufig nicht einfach nur den GUI-Benutzer im Sinn.

    Und noch dazu können sich 100 Millisekunden ganz schnell aufaddieren. Bei einem komplexen System können hier und da immer wieder mal 100 Millisekunden verplempert werden, so dass gleich ein paar Sekunden oder noch mehr raus kommen.



  • berniebutt schrieb:

    hustbaer schrieb:

    Algorithmen mit Integration trimmen. Kannst du das nochmal auf verständlich schreiben?

    Naturwissenschaftlern und Ingenieueren ist das hinreichend verständlich. Oft sind Aufgaben nicht durch eine feste Formel oder durch ein einfaches lineares Gleichungssystem genau genug lösbar. Dann braucht man eine 'Schrittweise Annäherung = Iteration' mit einem bekannten Kriterium für die Genauigkeit einer Zielgrösse (Konvergenzkriterium).

    Stelle dir vor, du brauchst für jeden einzelnen Iterationsschritt ein grösseres lineares Gleichungssystem (z.B. 1000 x 1000). Dessen Lösung braucht Rechenzeit. Es kommt also entscheidend darauf an, wieviele Iterationsschritte man bis zum Ziel benöntigt (10 oder gar 1000). Das Finden einer passenden Startbedingung und die Verbesserung bei jedem neuen Iterationsschritt sind dann das 'Trimmen des Algorithmus', um die Anzahl der erforderlichen Iterationen möglichst gering zu halten.

    Ich habe auch "trimmen" noch nie im Zusammenhang mit "Algorithmus" gehört/gelesen, und bezweifle dass das allgemein von Naturwissenschaftlern verstanden wird.



  • tntnet schrieb:

    100 Millisekunden später kann schon mal ein paar millionen Euro ausmachen, wenn es um Tradingsysteme geht.

    Damit wäre alles Trading reiner Zufall, weil kein Trader im 100ms Bereich reagiert.

    Und noch dazu können sich 100 Millisekunden ganz schnell aufaddieren. Bei einem komplexen System können hier und da immer wieder mal 100 Millisekunden verplempert werden, so dass gleich ein paar Sekunden oder noch mehr raus kommen.

    Merkst du was der Unterschied zwischen premature Optimization und optimieren an der richtigen Stelle ist. Mit dem Addieren der Zeit kommst du zu dem was berniebutt schreibt.



  • Wenn man das Geld/Zeit hat würde ich immer versuchen zu optimieren. Viele sagen bei z.B GUI lohnt das nicht, das sehe ich anders. Wenn du eine Arbeitsfläche mit z.B. 50 UML-Elementen hast, die per GUI-Framework gezeichnet werden, macht es schon einen großen Unterschied ab das Zeichnen und Verwalten 100ms oder nur 10ms-50ms dauert.

    Was ich bis jetzt gelernt und gelesen habe optimiert der Compiler zwar so einiges aber es wird nie so gut sein können um eine Implementierung einfach von Grund aus anders angehen zu können, siehe Volkards Paradebeispiel.

    Meiner Meinung nach brauch man nicht Alles zu optimieren, aber die Haltung von heute so gut wie gar nicht zu optimieren finde ich auch nicht richtig denn das ist Ressourcen- und damit Energieverschwendung. Aber ich kann auch verstehen wenn es wirtschaftlich keinen Sinn macht zu optimieren.

    Gruß Blue-Tec



  • blue-tec schrieb:

    Wenn man das Geld/Zeit hat würde ich immer versuchen zu optimieren. Viele sagen bei z.B GUI lohnt das nicht, das sehe ich anders. Wenn du eine Arbeitsfläche mit z.B. 50 UML-Elementen hast, die per GUI-Framework gezeichnet werden, macht es schon einen großen Unterschied ab das Zeichnen und Verwalten 100ms oder nur 10ms-50ms dauert.

    Was ich bis jetzt gelernt und gelesen habe optimiert der Compiler zwar so einiges aber es wird nie so gut sein können um eine Implementierung einfach von Grund aus anders angehen zu können, siehe Volkards Paradebeispiel.

    Meiner Meinung nach brauch man nicht Alles zu optimieren, aber die Haltung von heute so gut wie gar nicht zu optimieren finde ich auch nicht richtig denn das ist Ressourcen- und damit Energieverschwendung. Aber ich kann auch verstehen wenn es wirtschaftlich keinen Sinn macht zu optimieren.

    Die Haltung von heute ist auch nicht, Programme gar nicht zu optimieren, sondern nur das, was messbar zu langsam ist. Man schreibt nur nicht von Anfang an total komplizierten, "optimierten" und kryptischen Code, in der Hoffnung, dass man hier und da 3 Operationen spart. Man überlegt sich besser, welche Algorithmen die richtigen sind und wie ein sauberes Design aussieht, dass man das Programm einfach warten und erweitern kann. Dann kann man auch einfach einen zu langsamen Algorithmus austauschen oder optimieren, ohne das ganze Programm anpassen zu müssen. Das Beispiel von volkard ist eben kein Paradebeispiel, weil es viel zu klein ist. Große Programme die von vielen Leuten geschrieben werden, sind viel zu komplex, um einfach sagen zu können, was viel Zeit brauchen wird. Ich glaub es gibt irgend einen Spruch, dass man Programme erst mal zum laufen bekommen soll, dann stabil und dann schnell. Nur für den letzen Teil hat man heute nur noch sehr wenig Zeit (oft auch schon für die ersten beiden Teile), weil irgendwelche Manager das Zeug auf den Markt werfen wollen, wenn es halbwegs stabil läuft.



  • Ich teile auch die Meinung zuerst die Funktion dann die Optimierung, aber zu komplex kann keine Ausrede sein. Komplexe Software wird auch unterteilt und wenn nicht der Mensch erkennt wo der Flaschenhals ist dann sind es Unit-Tests oder Profiler die da helfen können. Das Design der Software muss dafür natürlich ausgelegt sein.

    Meine Rede war auch nicht jedes feuchtes Lüftchen auf eine ns zu untersuchen, sondern die Stellen die stark frequentiert werden zu analysieren.



  • blue-tec schrieb:

    Ich teile auch die Meinung zuerst die Funktion dann die Optimierung, aber zu komplex kann keine Ausrede sein. Komplexe Software wird auch unterteilt und wenn nicht der Mensch erkennt wo der Flaschenhals ist dann sind es Unit-Tests oder Profiler die da helfen können. Das Design der Software muss dafür natürlich ausgelegt sein.

    Meine Rede war auch nicht jedes feuchtes Lüftchen auf eine ns zu untersuchen, sondern die Stellen die stark frequentiert werden zu analysieren.

    Genau die Stellen kennt man eben selten, vor das Programm fertig ist und manchmal nicht mal dann. Ich hab vor kurzem etwas optimiert, das wahrscheinlich bei 99 von 100 Kunden nie ein Problem ist, aber in einem speziellen Fall langsam wird. Je komplexer das System, desto mehr unterschiedliche Kombinationen von Datenmengen gibt es. Mit Unit-Tests hättest du das auch nicht gefunden, weil es erst auftritt, wenn man alle Teile kombiniert und entsprechende Daten verwendet.

    Meine Erfahrung ist: Je komplexer das System ist, um so erstaunlicher ist es welche Stellen sich als Flaschenhals rausstellen, wenn man den Profiler anwirft und schaut was langsam ist.



  • Na siehst du, also hast du persönliche schon mal komplexere Software optimiert 😃 Klar dass nicht alle Fälle von Anfang an geprüft werden können.



  • Das ist dann vergleichbar mit selten auftretenden Fehlern. 99% aller Fälle laufen einwandfrei - und plötzlich 'rumps ein dicker Bock'. Kommt vor!

    Ich hatte so etwas bei einem Programm zur Trassierung von Neubaustrecken der Bahn, das auch die ausführbaren Baupläne für den Gleiskörper lieferte. Viele Kilometer einwandfrei und dann in einer nicht getesteten Situation 10 cm zu wenig Schotter unter einer Schiene (der Zug hätte da entgleisen können). Der Mann auf der Schottermaschine hat das zum Glück bemerkt und Alarm geschlagen. Was war? 1 bis 2 Stunden Suche im Programm und eine einfache Korrektur einer von vielen if-Abfragen. Meine Bemühungen, dafür eine Betriebshaftpflichversicherung abzuschliessen schlugen fehl. Unisono hiess es 'unkakulierbares Risiko - das machen wir nicht.

    Mit solchen Möglichkeiten bewegen wir uns aber weg von der Fragestellung, weil zu sehr anwendungsspezifisch. Sorgfältige Planung eines Programmes und ausführliche Tests sind notwendig, können aber manchmal nicht alles abdecken. Das kann auch für die Optimierung der Laufzeit gelten!



  • XXXÄL schrieb:

    tntnet schrieb:

    100 Millisekunden später kann schon mal ein paar millionen Euro ausmachen, wenn es um Tradingsysteme geht.

    Damit wäre alles Trading reiner Zufall, weil kein Trader im 100ms Bereich reagiert.

    Wenn Du das so gut weisst, dann wird es wohl so sein. Es gibt zwar auch algorithmic trading, aber das verwendet bestimmt niemand.

    Premature optimization ist nicht gut, aber das bedeutet nicht, dass ich prinzipiell 100ms ignorieren kann.


Anmelden zum Antworten