• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Kurs - Ressourcensparendes programmieren

serie300

Well-Known Member
#26
Hallo
stimme Yamagi im prinzip zu, allerdings lässt sich u.U. viel rausholem, wenn man die Möglichkeiten der sprache richtig anwendet. Z.B hashes zur Indizierung oder matrixoperationen bei numerischen sprachen.

sagt halt gleich, was gemacht werden soll. optimierung bei datenkonvertierung ist was anderes wie optimierung bei speziellen numerik algorithmen

serie300
 

Athaba

Libellenliebhaber
Mitarbeiter
#27
Man muss sich wohl bei Aussagen, wie "Mein C-CSV-Parser ist schneller als mein Python-CSV-Parser" die Libraries ansehen. Wäre mir ziemlich sicher, dass da deutlich andere Sachen passieren.

Wie schon erwähnt kommt man mit Python in vielen Sachen nicht an C ran, aber so pauschal muss man auch vorsichtig sein. Mitunter called man ja in einem Python-Programm auch C, da kann dann der Call was langsames sein.

Aber es sind eine Reihe anderer Punkte, die den wirklich großen Performance-Unterschied machen in vielen Systemen. Neben den Garbage-Collector, der je nachdem wie man programmiert das Programm mitunter häufig zum Stillstand bringt gibt's noch so Sachen, wie dass man Dictionaries und Listen mit Structs und tyypsierten Arrays vergleicht, was natürlich Humbug ist. Wenn ich in ein dict, wo mir für jeden Key ein "kryptographischer" Hash mit einer Struktur, die direkt addressierbar im Speicher liegt und auf die ich direkt zugreife vergleiche, dann kann man sich ja schon denken, dass es einen Unterschied beim Zugriff darauf gibt. "Gib mir mal den Speicher" und "Rechne mir mal den Hash für folgenden Key aus, such mit dann in er Hashtabelle den passenden Key und nutze die Referenz dort um die Daten im Speicher zu finden" sind halt Welten an Unterschied.

Ganz generell, muss man aber eine Sprache, bzw. den Interpreter/Compiler kennen um das richtige zu tun, auch wissen was im Hintergrund passiert. Oft kann es auch schon helfen so grundsätzliche Dinge zu wissen, wie, ob ich jetzt Referenzen nutze oder Kopien erstelle, oder wie teuer meine Function Calls sind, ob die nette rekursive Funktion nicht doch mit einem einfach For-Loop deutlich schneller wäre, etc.

Ressourcen zu sparen ist auch ziemlich generisch. Welche Ressourcen? Memory, CPU-Zeit oder etwas ganz anderes?

Generische Bücher dazu zu finden ist schwierig, vor allem weil man da mitunter nicht das bekommt was man im Alltag braucht. Also wenn man sich zum Beispiel ein Buch mit vielen tollen Algorithmen schnappt, dann wird man schnell feststellen, dass die ja ohnehin von der Sprache bzw. der Library, die man nutzt verwendet werden.

Was man damit aber vielleicht bekommt ist ein Gefühl dafür wie Aufwendig ein Algorithmus/ein Programm ist, was Ressourcen angeht, auch was teuer ist (auch wenn man das am besten profiled/benchmarked).

Man kann's auch anders angehen und wenn man interpretierte Sprachen nutzt einfach mal Pypy oder LuaJIT nutzen. Das ist dann mitunter ein gelöstes Problem.

Im Endeffekt geht's dann aber auch Schnell in Richtung Erfahrung, weil auch wenn man sich mit all diesen Dingen beschäftigt hat, ist es gut zu wissen, wo man anfängt, was potentielle Quick-Wins sind, auch wenn man mit einem Profiler drüber gegangen ist und weiß, wo viel Zeit genutzt wird, heißt das noch Lange nicht, dass man weiß was die beste Möglichkeit das Problem anzugehen ist. Falscher Datentyp, falsches Lib, falscher Algorithmus, liegt's an meinem Code, kann ich die teure Funktion weniger oft callen, kann ich mir was sparen, wenn ich mir etwas merke oder gibt es ganz generell einen Trade-Off den ich machen kann, bzw. sollte ich das ganze Problem anders angehen oder bin ich gar ohnehin schon am Limit?

Ein Tipp wäre es ein Performance-Problem, das man schon hat, warum man vielleicht das ganze Thema angehen will herzunehmen und zu nutzen um genau zu verstehen warum es besteht und dieses Problem dann auf unterschiedliche Arten zu lösen und zu verstehen warum es da wieder die jeweiligen Unterschiede gibt. Das bringt sehr viel. Danach versteht man die Sprache (bzw. deren Compiler oder Interpreter) besser, versteht, ob Garbage Collection einen Einfluss hat und auch den Algorithmus und die Datenstrukturen, die man nutzt bzw. deren Implementierung.

Der Grund warum Erfahrung da wichtig ist, ist dass je nachdem was man will sehr, sehr unterschiedliche Dinge die Lösung des Problems sein können. Wenn's anders wäre hätten wir wahrscheinlich schon irgendwelche Tools die uns die Arbeit magisch abnehmen würden und sagen würden, was man zu tun hat. Teilweise gibt es so etwas sogar, aber meist auch noch gute Gründe einen Menschen drüber blicken zu lassen.
 
Themenstarter #28
Ich werde wohl wirklich weiter mit C arbeiten und die *.csv mittels VBA in ein File konvertieren

Ich habe nun mein C-Programm erweitert mit allen Features die ich mir in VBA verkniffen habe und gleiches noch optimiert mit einer Laufzeit von 0.305s (VBA mit den simpelsten Features only 20s +). Weiterhin, auch wenns eigentlich egal ist, braucht mein C-Programm kaum RAM, womit ich es als Dauerschleife einen Ordner nach Input scannen lassen kann (Automatisierung).

Bin wirklich froh C gelernt zu haben :)

Neben den Garbage-Collector, der je nachdem wie man programmiert das Programm mitunter häufig zum Stillstand bringt
Von solchen Gedanken bin ich noch Monate entfernt, bin momentan noch recht froh wenn ein Programm genau macht was ich will, bzw. auch nur die Funktionen nutzen, die als "gut" gelten.
 

Yamagi

Possessed With Psi Powers
Mitarbeiter
#29
womit ich es als Dauerschleife einen Ordner nach Input scannen lassen kann
Dafür haben die meisten Betriebssysteme Lösungen. Bei den den BSDs und OS X kqueue(), Linux inotify und unter Windows Changes. Man bekommt bei einer Änderung des überwachten Verzeichnis vom Betriebssystem ein Event und muss nicht mehr selbst pollen. :)

kqueue: https://www.freebsd.org/cgi/man.cgi?query=kqueue
inotify: http://man7.org/linux/man-pages/man7/inotify.7.html
Changes: https://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
 
Themenstarter #30
Dafür haben die meisten Betriebssysteme Lösungen. Bei den den BSDs und OS X kqueue(), Linux inotify und unter Windows Changes. Man bekommt bei einer Änderung des überwachten Verzeichnis vom Betriebssystem ein Event und muss nicht mehr selbst pollen. :)
Hm, wäre fast froh das nicht gewusst zu haben, damit könnte ich die Outputs meiner Mikroskope voll automatisieren

Arbeit, Arbeit, .... :)
 

Vril

Well-Known Member
#32
Ja und nun?
Wie programmiert man nun effektiv bzw. ressourcensparend?

Ich persönlich würde folgendes sagen:
( wobei das aber auch nur auf meine Bedrürfnisse in einem bestimmten technischen Umfeld zutreffen mag )

1. prozedural statt objektorientiert ( hier kommt jetzt der erste Aufschrei ;-) )
2. Interpreter und interpreterähnliche ( bytecode ) Sprachen meiden, also kein Perl, Pyhton, Java usw.
3. Effiziente Sprachen wählen, die da IMHO wären: Assembler, C, Forth ;-)
 

-Nuke-

Well-Known Member
#33
Die Syntax oder das Paradigma eine Programmiersprache sagt recht wenig über dessen Ressourcenverbrauch oder Performance aus. Einzig was der Compiler am Ende daraus macht ist relevant. Eine Ebene oben drüber zählen die Algorithmen und Datenstrukturen, die du als Entwickler verwendest.
 
Themenstarter #34
Wie programmiert man nun effektiv bzw. ressourcensparend?
Datentypen: So klein wie möglich, so groß wie nötig
Algorithmus: Strukturen die am meisten verwendet werden möglichst hoch einbauen (damit weniger if else... Überprüfungen stattfinden)
Funktionen: Das Programm soll möglichst wenig suchen, dynamik sollte wirklich nur genutzt werden, wo sie benötigt wird

Meine Meinung, schwimme jedoch in Halbwissen :)