Kurs - Ressourcensparendes programmieren

mogbo

Banned
Hallo,
ich weiß nicht wie unsinnig die Frage jetzt rüberkommt:

Ich habe aktuell ein paar kleine Probleme mit der Performance mancher Tools (selbstgeschrieben) und die Laufzeitoptimierung fällt unter Trial and Error. Werksinterne Schulungen könnte ich bekommen, jedoch leider nur für andere Sprachen bzw. Anwendungsgebiete.

Arbeiten tue ich hauptsächlich mit C, Perl und VBA (unter Windows bzw. Cygwin)

Würden mich hier Pythonschulungen bzw. Speicheroptimierung C++ (Embedded Systems) weiterbringen oder müsste ich mir wirklich Schulungen für die jeweiligen Sprachen suchen?

Die Voraussetzung für Python wären lediglich Grundkenntnisse (könnte ich mir denke ich in ein paar Tagen aneignen) und für die C++ Schulung werden nur C Grundkenntnisse vorausgesetzt
 
Hi,

"Algorithmen und Datenstrukturen" ist da ein dringendes Thema, dies ist völlig unabhängig von der Programmiersprache und etwas aus der theoretischen Informatik.

Rob
 
Wenn es um Laufzeit- oder Speicheroptimierung geht wirst du bei dynamischen Spachen wie Python oder Perl immer an Grenzen stossen die der Spache immanent sind. Das mehr oder minder große Laufzeitsystem und die Redirektion der Funktionsaufrufe kostet eben einiges. Das läßt sich in einigen Sprachen durch JIT Compiler (z.B. LuaJIT), hochoptimierende Compiler oder Übersetzung nach C wie in einigen Lisp-Dialekten in Teilen reduzieren.
 
Hallo,
Ich habe aktuell ein paar kleine Probleme mit der Performance mancher Tools (selbstgeschrieben) und die Laufzeitoptimierung fällt unter Trial and Error. Werksinterne Schulungen könnte ich bekommen, jedoch leider nur für andere Sprachen bzw. Anwendungsgebiete.

Ich denke mir ob es Sinn macht oder nicht hängt von deinen Voraussetzungen ab. Hast du das Programmieren richtig gelernt, oder selber angeeignet? In entsprechenden Lehrgängen lernt man in der Regel auch gleich wie man besser/effizienter Programmiert, was beim Selbststudium meist nicht der Fall ist. Wenn deine Performance Probleme eher davon kommen das du nicht optimal programmieren kannst, oder erweiterte Techniken nicht verstehst, dann wäre ein Lehrgang definitiv eine gute Idee. Da spielt die Sprache eigentlich auch keine so große Rolle, die Logik die dahinter steckt lässt sich auf andere Sprachen in den meisten Fällen übertragen.

Wenn deine Probleme aber daraus resultieren das du in deinem Programm versuchst das Rad, Getriebe und den Motor neu zu erfinden, anstatt optimierte Bibliotheken für ein Problem zu nutzen, dann wird dir der Lehrgang vermutlich nicht viel helfen. Das gilt natürlich nicht wenn es wirklich um spezielle Techniken geht ;)

Vielleicht wäre auch mal das Buch hier ein Blick wert https://www.oreilly.de/buecher/120174/9783897215672-weniger-schlecht-programmieren.html
 
Um wirklich zu lernen und zu verstehen, was auf dem Rechner vorgeht, wie der Speicher belegt wird usw., wuerde ich empfehlen C und Assembler zu lernen. Du musst in Assembler nichts programmieren koennen, sondern nur ein wenig von den Grundlagen verstehen:

1.) Lerne die Grundlagen von Assembler kennen: Register, Stack, Speicherzugriff, die gebraeuchlichsten Befehle. Versuch aber jetzt noch nicht, irgendwas damit zu programmieren.

2.) Lerne C programmieren. Aktiviere die Assembler-Ausgabe des Compilers. Jedes Mal, wenn Du eine Funktion erfolgreich kompiliert hast, schaue Dir die vom Compiler generierte Assembler-Ausgabe an. Schaue Dir alle Anweisungen an, die Du noch nicht kennst. Stelle sicher, dass Du verstehst, wie der Assembler-Code dem C-Code entspricht, den Du vorher geschrieben hast. Probiere verschiedene Optimierungsstufen (und andere Compiler-Optionen) aus, um zu sehen, welche Unterschiede diese machen.

3.) Nutzen: Auf diese Weise wirst Du ein viel tieferes Verstaendnis beider Sprachen entwickeln, als wenn Du beide Sprachen getrennt voneinander lernen wuerdest.
 
@midnight Ist natürlich die Frage wie viel Nutzen das ganze hat. Klar verstehen wie etwas funktioniert ist gut, aber er nutzt ja neben c anscheinend überwiegend interpretierte Sprachen und da nutzt einem das nicht mehr viel. Da hilft nur einen logischen und durchdachten Ablauf zu erstellen um sich doppelte und dreifache Durchläufe von irgendwas zu ersparen das man bei einer anderen Aktion schon gleich mitmachen kann.

Davon abgesehen ist die Frage wie viel man durch Compileroptionen und ähnliches erreichen kann. Es ist ja so das wir inzwischen mehr Leistung haben als ein Konsolenwerkzeug/Gui benötigen kann. Eigentlich gleicht aktuelle Hardware viel schlampigen Code wieder aus. In aller Regel spielt es im Alltag ja auch keine so große Rolle ob ein Programm nun eine Sekunde oder 1,3 Sekunden braucht um eine Ausgabe zu erzeugen ;)

Hauptproblem ist eben das die Leute heute nicht mehr richtig Programmieren lernen. Man deckt zwar in Lehrgängen gigantische Spannweiten ab, aber effizientes Programmieren bei Ressourcenmangel ist in aller Regel nicht Bestandteil. Sehe ich bei uns an der Arbeit regelmäßig, Programmierer bewerben sich mit hunderten Dingen die sie können und perfektioniert haben aber Effizienz gehört da nicht dazu.

Am besten um das zu lernen auf Ebay nach alter Technik schauen. Ein 486er mit 4 mb Ram oder einen Commodore und dann einfach mal ein kleines Projekt darauf umsetzen wie ein Tetris oder Mario Clone und dann lernt man dabei zu optimieren ;)
 
Um wirklich zu lernen und zu verstehen, was auf dem Rechner vorgeht, wie der Speicher belegt wird usw., wuerde ich empfehlen C und Assembler zu lernen. Du musst in Assembler nichts programmieren koennen, sondern nur ein wenig von den Grundlagen verstehen:

1.) Lerne die Grundlagen von Assembler kennen: Register, Stack, Speicherzugriff, die gebraeuchlichsten Befehle. Versuch aber jetzt noch nicht, irgendwas damit zu programmieren.

2.) Lerne C programmieren. Aktiviere die Assembler-Ausgabe des Compilers. Jedes Mal, wenn Du eine Funktion erfolgreich kompiliert hast, schaue Dir die vom Compiler generierte Assembler-Ausgabe an. Schaue Dir alle Anweisungen an, die Du noch nicht kennst. Stelle sicher, dass Du verstehst, wie der Assembler-Code dem C-Code entspricht, den Du vorher geschrieben hast. Probiere verschiedene Optimierungsstufen (und andere Compiler-Optionen) aus, um zu sehen, welche Unterschiede diese machen.

3.) Nutzen: Auf diese Weise wirst Du ein viel tieferes Verstaendnis beider Sprachen entwickeln, als wenn Du beide Sprachen getrennt voneinander lernen wuerdest.
Hört sich nach einem schönen Projekt für die Freizeit an, danke hierfür

Wenn es um Laufzeit- oder Speicheroptimierung geht wirst du bei dynamischen Spachen wie Python oder Perl immer an Grenzen stossen die der Spache immanent sind. Das mehr oder minder große Laufzeitsystem und die Redirektion der Funktionsaufrufe kostet eben einiges. Das läßt sich in einigen Sprachen durch JIT Compiler (z.B. LuaJIT), hochoptimierende Compiler oder Übersetzung nach C wie in einigen Lisp-Dialekten in Teilen reduzieren.
evtl wird das in einem Jahr zum Thema, bin ich aber momentan eher noch zu weit von entfernt

du in deinem Programm versuchst das Rad, Getriebe und den Motor neu zu erfinden, anstatt optimierte Bibliotheken für ein Problem zu nutzen
Räder erfinde ich nur in meiner Freizeit neu :)

@midnight Ist natürlich die Frage wie viel Nutzen das ganze hat. Klar verstehen wie etwas funktioniert ist gut, aber er nutzt ja neben c anscheinend überwiegend interpretierte Sprachen und da nutzt einem das nicht mehr viel. Da hilft nur einen logischen und durchdachten Ablauf zu erstellen um sich doppelte und dreifache Durchläufe von irgendwas zu ersparen das man bei einer anderen Aktion schon gleich mitmachen kann.
Genau hier stecken meine Probleme, ich optimiere evtl. die Abläufe einfach noch nicht genug, leider muss ich jetzt einen zu hohen Mehraufwand für zuwenig Resultat aufbringen. Die Laufzeit dritteln (von 60s auf 20s) ging fix, jetzt macht mir jede Sekunde zu schaffen :)
Das Wählen der richtigen Datentypen ist denke ich kein Thema mehr (ein Hoch auf C und Bücher/youtube)
 
Genau hier stecken meine Probleme, ich optimiere evtl. die Abläufe einfach noch nicht genug, leider muss ich jetzt einen zu hohen Mehraufwand für zuwenig Resultat aufbringen. Die Laufzeit dritteln (von 60s auf 20s) ging fix, jetzt macht mir jede Sekunde zu schaffen :)
Na ja, es gibt schon einige Tricks die man anwenden kann, z.B. anlegen eines Objekt/Speicher pools, wo immer möglich Variable durch Konstante ersetzen, innere Schleifen optimieren oder durch switch/funktionstabellen ersetzen, evtl. redesign des Projektes. Bei modernen Prozessoren spielt das Catch-Verhalten eine wichtige Rolle worauf man die Datenstrukturen ausrichten kann. Ohne Profiler kommt man da aber nicht weit.

Und wie schon gesagt: Perl und Python vermeiden. ;-)
 
Du kannst sicher auch performanten Python Code schreiben nur irgendwann bis du in einem Bereich wo du soviel investiert hast wie bei C oft unter Missachtung aller Standards. Da du kaum Einfluss auf den Compiler hast, hüte dich vor ^^ solchen Ratschlägen.
 
Es stellt sich nur die Frage ob es sich lohnt unterm Strich 70 Arbeitsstunden zu investieren um etwas ein paar Sekunden zu beschleunigen. Da muss man im Einzelfall schauen was und wie oft ein Programm arbeitet. Wenn man ein Script einmal am Tag startet dann würde ich eher 10 Sekunden Wartezeit in Kauf nehmen als 40 Stunden zu investieren um es etwas schneller zu machen. Da wäre die investierte Zeit erst in Jahrhunderten wieder drinnen ;) Bei einer Simulation als Beispiel wo ein Prozess millionen mal gestartet wird macht natürlich jede Millisekunde etwas aus in der Endzeit und kann dann durchaus Tage oder Wochen Zeit sparen.
 
Auf jeden Fall solltest du lernen, die Performance zu messen, wie beispielsweise mit Profilern. Auf Verdacht hin zu optimieren ist Hellseherei.
 
Es stellt sich nur die Frage ob es sich lohnt unterm Strich 70 Arbeitsstunden zu investieren um etwas ein paar Sekunden zu beschleunigen. Da muss man im Einzelfall schauen was und wie oft ein Programm arbeitet. Wenn man ein Script einmal am Tag startet dann würde ich eher 10 Sekunden Wartezeit in Kauf nehmen als 40 Stunden zu investieren um es etwas schneller zu machen.
Kommt immer drauf an, ich baue eine Datenbank die von mehreren Standorten als Referenz genutzt wird, diese ist allgemein Downloadbar (intern) im "Access"-Format. Da diese Datenbank meine Stelle mehr oder weniger vollständig repräsentiert, ist es mir sehr wichtig dass das Nutzungsgefühl perfekt ist, somit geht Performance für mich über alles. Hier nehme ich gerne 40 Stunden in kauf um gewisse Abfragen eine halbe Sekunde zu beschleunigen.

Bei allem anderen gebe ich dir recht, jedoch bin ich auch wirklich unzufrieden, wenn ich dem PC 20 Sekunden beim Laden zusehen muss (mehrmals am Tag).

Auf jeden Fall solltest du lernen, die Performance zu messen, wie beispielsweise mit Profilern. Auf Verdacht hin zu optimieren ist Hellseherei.
Guter Tipp, Danke
 
Du kannst sicher auch performanten Python Code schreiben nur irgendwann bis du in einem Bereich wo du soviel investiert hast wie bei C oft unter Missachtung aller Standards.

Nicht wirklich. Wenn du bei reinem Python bleibst (sprich, keine C-Bibliotheken über Python Wrapper nutzen) erhälst du immer schnarchlangsame Anwendungen. Python Code ist Single Threaded und interpretiert. Es gibt Projekte wie pypy die Python Code auf schnellere Art und Weise ausführen, aber die sind nicht 100%ig kompatibel.

Ich hatte mal einen kleinen mathematischen Algorithmus einmal in Python und einmal in C++ implementiert. Die Laufzeit lag bei Python im Minutenbereich, bei C++ im einstelligen Sekundenbereich.
 
Man kann durchaus mit Python gut und schnell arbeiten. Für einige Dinge eignen sich andere Sprachen aber manchmal besser. Ich denke mir mal das ein Compiler viel übernimmt und am Ende weiß man auch nicht mehr was im Endprogramm noch alles vom eigenen Code übrig bleibt, während Python wirklich Zeile für Zeile abarbeitet, ob diese nun Sinn macht oder nicht ;)

Simples Beispiel, eine Schleife die sich 100x wiederholt und die Variable x immer um eins hochzählt, diese Variable wird aber nicht in der Schleife und auch später nicht mehr verwendet. Ein Compiler würde den gesamten Block rauswerfen weil er keinen Sinn macht während Python sauber den Sinnlosen Code ausführt. Sprachen woe Python haben aber den Vorteil das man den Ablauf ganz genau nachvollziehen kann was bei einem Code der durch einen Compiler gelaufen ist nicht immer so genau möglich ist.

Es hat eben alles seine Vorteile und Nachteile. Ich finde es zum Beispiel recht umständlich mich um den Speicher zu kümmern in c/c++, da sind andere Sprachen einfacher wo der Garbarge Collector alles selber regelt. Hat natürlich den Nachteil das so eine Speicherbereinigung ausgerechnet an einer Zeitkritischen Stelle schlecht ist ;) Wobei ich mich mal aus dem Fenster lehne und behaupte das 90% der Programmierer keine Ahnung haben wie man anständig eine Speicherverwaltung reallisiert ;)
 
Seitdem C++ offiziell Smartpointer im Standard hat, ist das mit der Speicherverwaltung in C++ auch nicht mehr so kritisch. Man muss sich halt nur daran halten. Da programmiert man dann nicht sonderlich anders als bei Sprachen mit Garbage-Collector. Das Auto-Keyword nimmt dir auch etwaige nervige Typverfolgung ab.

Soll jetzt nicht heißen, dass ich jetzt C++ überall besser finde. Schreibe selbst kleinere Tools und Mini-Webservices lieber in Python als in C++. Die Library bei Python ist halt unfassbar umfangreich und hochwertig.
 
@mogbo: Was ich nicht verstehe ist warum du unbedingt Python optimieren willst. In der Zeit die du dazu brauchst kannst du allemal eine leichtgewichtigere und schnellere Sprache wie z.B. Lua (oder alternativ ein Lisp/Scheme-Dialekt) lernen die du dann auch leicht optimieren oder Teile durch C-Biblotheken ersetzen kannst wenn notwendig. Lua hat nur ein kleines Laufzeitsystem, ist prakisch Pseudocode und leicht eizubetten. Mach dir den Job doch nicht schwieriger als er eh ist. Und wenn es um wirklich kritische Bereiche geht ist C/C++ eh die erste wahl.

Python ist OK für begrenzte Sachen, aber doch nicht als Teil eines umfangreicheren Projektes.
 
Ich denke man sollte unterscheiden:
  • Wenn es bei "ressourcensparenden Programmieren" generell um Techniken geht, z.B. die Anwendung von Algorithmen und Datenstrukturen, ist die Sprache völlig egal. Ein ineffizienter Algorithmus ist in jeder Sprache ineffizient und ein effizienter Algorithmus logischerweise in jeder Sprache effizient. Das die erreichbaren Ausführungsgeschwindigkeiten bei Python niedriger als bei C++ sind, ist dabei erst einmal irrelevant.
  • Erst, wenn dieses Handwerkszeug ausgereizt ist und es darum geht, wie man ein konkretes Problem abseits allgemeiner Dinge wie Datenstrukturen oder Algorithmen schneller bekommt, kommen Dinge wie die Auswahl der Sprache oder Profiler ins Spiel.

Je nach dem welchen der beiden Punkte das Kurangebot abdeckt und wo man sich selbst sieht sollte man schauen, ob der Kurs für sich sinnvoll ist oder nicht.
 
Je nach dem welchen der beiden Punkte das Kurangebot abdeckt und wo man sich selbst sieht sollte man schauen, ob der Kurs für sich sinnvoll ist oder nicht.
Da ich vermutlich ineffiziente Algorithmen schreibe, werd ich meine Kurse wohl hiernach filtern. Die Basics einer mir fremden Programmiersprache sind ja (hoffe/denke ich) gleich gelernt
 
Habe mal scherzhalber eine meiner Excel-Tabellen in eine *.csv umgewandelt und ein VBA Script in C nachgebaut.

Laufzeit:
VBA: 23.09s
C: 0.079s

Hm, irgendwie bissl lächerlich ...
 
Hier könnte das Problem wirklich mal bei VBA liegen. Das wird sicher ähnlich flott in Python sein. Beziehungsweise Excel... Musst du das benutzen?
 
Musst du das benutzen?
2 meiner Mikroskope erzeugen riesen Datenmengen in *.csv, 1 Mikroskop erzeugt direkt *.xls. In der Regel habe ich bisher alle Daten aus der den beiden csv mithilfe von C formatiert und via VBA in die xls übertragen. Dort laufen 2 weitere VBA Scripte und anschließend gehts ab in Access

VBA ist halt die simpelste Antwort, aber ich vermute langsam die falsche
 
Meine Empfehlung wäre es nur noch CSV zu verwenden und diese Dinge dann direkt in eine Datenbank reinzuladen. Und das wäre nicht Access, sondern eher Postgresql. Das geht direkt in der Datenbank, keine spezielle Programmierung notwendig. Das gibt's auch für Windows, sofern du auf der Plattform bleiben musst. Die Datenbank kannst du dann mit der Programmiersprache deiner Wahl bearbeiten. Ein Vorteil wäre auch, dass du sehr leicht automatisiert Sicherungen machen kannst.

Ich weiß ja nicht was später dann mit den Daten passieren soll aber wenn andere die nur einsehen sollen, dann würde ich dazu eine Weboberfläche bauen. Auch das ist kein Hexenwerk mehr, ein bisschen PHP (oder Python oder irgendwas anderes ;) ) und sowas wie Bootstrap für die Optik.

PS: Und weil Python ja doch relativ zugänglich ist: https://github.com/python-excel/xlrd
Schau doch mal wie schnell du damit die XLS nach CSV kopieren kannst.
 
Meine Empfehlung wäre es nur noch CSV zu verwenden und diese Dinge dann direkt in eine Datenbank reinzuladen. Und das wäre nicht Access, sondern eher Postgresql
Von Access komm ich leider auch nicht weg, wurde mir aufgezwungen, die Idee über eine Weboberfläche zu gehen hatte ich auch schon

PS: Und weil Python ja doch relativ zugänglich ist: https://github.com/python-excel/xlrd
Schau doch mal wie schnell du damit die XLS nach CSV kopieren kannst.
Hm, damit könnte ich was anfangen. Ich schau Montag mal rein!
 
Zurück
Oben