Laden...

Performance eines C# Programms erhöhen

Erstellt von snsewill vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.950 Views
S
snsewill Themenstarter:in
18 Beiträge seit 2013
vor 10 Jahren
Performance eines C# Programms erhöhen

Hallo, ich habe einen sehr Rechenintensiven Algorithmus geschrieben der pro Durchlauf so ca. 30 Funktionsaufrufe beinhaltet. Die Rechnungen innerhalb dieser Funktionen sind relativ einfach. Meine Frage ist jetzt, ob es allgemeine Tipps gibt um die Performance eines Programm zu erhöhen? Z.B. arbeite ich viel mit dem Datentyp double. Wird eine Rechenoperation schneller ausgeführt wenn ich die Zahl auf 3 Nachkommastellen runde? Oder dauert sie dann sogar länger? Oder welche schleife sollte man eher verwenden? For- oder foreach-Schleife?

Ich weiß die Frage ist sehr schwammig aber vielleicht gibt es ja allgemeine Grundregeln!?

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo snsewill,

das Wichtigste: "premature optimization is the root of all evil" (Donald E. Knuth).
D.h. schreib den Code so dass er leserlich, wartbar und verständlich ist. Erst wenn du tatsächlich (mit einem Profiler, etc) feststellst, dass es zu langsame Passagen gibt, solltest du diese optimieren.

Weiters gilt es einen Algorithmus mit möglichst niedriger Aufwandsklasse (Big-O-Notation) zu wählen. Das hilft wesentlich mehr als Mikrooptimierungen.

wenn ich die Zahl auf 3 Nachkommastellen runde?

Die gegenwärtigen Prozessoren können alle mit double sehr gut umgehen, ein Runden ist nur zusätzlicher Aufwand und sollte tunlichst vermieden werden. Runden kannst du dann bei der Ausgabe des doubles (wenn nötig).

For- oder foreach-Schleife?

Grundsätzlich ist die for-Schleife schneller als die foreach-Schleife. Bei Arrays ist es aber egal, da der C#-Compiler aus dort aus der foreach- eine for-Schleife macht. Ein Grund mehr warum der Code leserlich erstellt werden soll, den Rest soll(te) der Compiler erledigen.

Es gibt aber ein paar Tricks mit denen der Code performanter erstellt werden kann. Suche einfach mal danach 😉 Google-Suche nach c# performance optimization

Für eine konkrete Frage könnte ich konkreter Antworten.

Wichtig ist messen, den nur aufs gute Glück hin optimieren kann schnell in die Hose gehen. Moderne Prozessoren machen mit ihren Optimierungen oft einen Strich durch Rechnun - wie z.B. bei Cache-Lines, Instruction Parallelism, usw. Daher ist das eingangs erwähnte Zitat jedenfalls zu beherzigen.
An deiner Idee mit dem Runden siehst du auch, dass der Schuss nach hinten los ginge nur weil du an "premature optimization" dachtest 😃

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
snsewill Themenstarter:in
18 Beiträge seit 2013
vor 10 Jahren

Vielen Dank erstmal! Ich gucke mal ob ich ein genauere Fragen formulieren kann.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo snsewill,

ich schließe mich den Aussagen von gfoidl in jeder Hinsicht an. Ich möchte daher zu dem Hinweis mit den Aufwandsklasse vs Mikrooptimierungen nur noch Beispiel ergänzen: Mergesort langsamer als Bubblesort? [==> Nein, Messfehler / Aufwandsklasse vs. Mikrooptimierungen].

herbivore

P
660 Beiträge seit 2008
vor 10 Jahren

einfach nur am rande erwähnt:
in der DotNetPro gab es einen Artikel über Dynamische Programmierung (im Grunde Algo-Optimierungen).

DotNetPro 09/2013

aber wie gfoidl und herbivore schon sagten: Erst optmieren wenns nötig ist.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"