Entwickler-Ecke

Sonstiges (.NET) - C# Performance Grundsätzlich


haschme - Di 03.12.19 11:46
Titel: C# Performance Grundsätzlich
Hallo zusammen,

ich entwickel derzeit vorwiegend Desktop-Anwendungen in C#/.Net (WinForms und WPF).
Da in meinem Bereich letzendlich auch die Performance meiner Software eine wichtige Rolle spielt (Vorwiegend IO-Zugriffe und String-Verarbeitungen/Abgleiche/Vergleiche/Anreicherungen)
Würde ich gerne mal die Frage in den Raum werfen, in wie weit C# performancetechnisch dafür geeignet ist
bzw. ob es Sprachen (z.B. systemnähere Sprachen wie C++) gibt, die rein performancetechnisch gegenüber C# in diesen Bereichen immer einen deutlichen Leistungsvorteil haben?
Bei meiner Frage einfach mal davon ausgehend, dass sowohl in C# als auch der jeweils anderen Sprache die gleiche Logik in die jeweilige Syntax übersetzt wurde.

Ich habe beim Googeln immer mal wieder wiedersprüchliche Aussagen dazu entdeckt, deshalb wollte ich diese Frage nochmal hier aufgreifen.
Was mich auch interessieren würde, kennt jemand von euch vielleicht eine Seite oder einen Thread im Forum,
wo es vielleicht eine Art Leitfaden gibt wie man in C# seine Anwendungen auf Performance trimmt? (So Ratschläge wie StringBuilder statt String verwenden oder Benchmarks sind für mich immer interesannt)

Vielen Dank im Vorraus und viele Grüße!


Ralf Jansen - Di 03.12.19 15:06

Wenn du eine Sprache/Framework wählst die weniger Abstraktionsschichten hat kommst du näher an das Problem und kannst eher für einen konkreten Fall hin optimieren.
Dazu bedarf es aber mehr als durchschnittliche Erfahrung in der jeweiligen Sprache/Framework. Mal abgesehen von Exoten die eher irrelevant sind.

Der Durchschnittsentwickler wird eher an seinen eigenen Fähigkeiten scheitern und der Wahl der entsprechenden Framework Features als an der grundsätzlichen Wahl der Sprache/Framework.
Es gibt in jeder Sprache/Framework meist mehrere Wege etwas zu tun. Und jeder hat andere Implikationen auf Performance/Security/Testbarkeit etc.

Auf diese Frage "gibt es immer einen deutlichen Leistungsvorteil" ist die Antwort eigentlich immer nein. Vor/Nachteil hängt immer von der Wahl der Waffen (auch innerhalb der Sprache) ab und wer die Waffe wie führt. Ich vermute mal das dir das aber auch schon selbst bewusst war ;)

Allgemeine Ratschläge hätte ich nicht aber wir sind hier ja hier ein sehr hilfsbereites Forum und wenn du konkrete Fragen hast wie man etwas performancemäßig optimieren könnte zeig uns doch konkreten Code in ein entsprechenden Posting. Dann kann man darauf eingehen und auch die ~anderen~ Themen abklopfen. Optimierung ist ja meist ein Tausch. Und mann muss sich dann Fragen "was gebe ich für Performance auf" bzw. wo kann ich Einschränkungen akzeptieren. Z.b. in Sicherheit, Systemunabhängigkeit, Testbarkeit, Wartbarkeit, Lesbarkeit etc.


doublecross - Mi 04.12.19 10:58

Hi,

ich muss user profile iconRalf Jansen zustimmen und möchte ergänzend anmerken, dass Windows kein Echtzeitbetriebssystem ist. Das heißt, egal in welcher Sprache du dein Windows Programm implementierst, du hast keine Garantie dafür das dein Code nach einer bestimmten Zeitspanne abgearbeitet wird, denn eventuell bekommt es den Prozessor eine weile nicht von Windows zugeteilt. Das mag unwahrscheinlich sein, eine Garantie hast du aber nicht.

Ansonsten müssten es schon enorme Datenmengen sein, die du verarbeitest, um hier auf Probleme zu stoßen, sofern du dich ein wenig mit den von deiner Sprache/Framwork zur Verfügung gestellten Werkzeugen zur Stringmanipulation auseinander gesetzt hast.

Ansonsten habe ich festgestellt, dass es viel Lebenszeit spart, die erste Regel bezüglich Programmoptimierungen zu befolgen: http://wiki.c2.com/?RulesOfOptimization. Das entbindet dich aber wie gesagt nicht davon, generell sauber zu arbeiten. Im falle von C#/.NET heißt das z.B. den Stringbuilder [https://www.tutorialsteacher.com/csharp/csharp-stringbuilder] zu verwenden, wenn du Strings zusammensetzt oder auch Schleifen abzubrechen, wenn du das Ziel erreicht hast, für welches sie da sind. Sauber Programmieren, aber nicht in den Optimierungswahn zu verfallen, solange das Problem noch gar nicht erkennbar ist, denn dann optimiert man meist an den Falschen Stellschrauben herum.


jfheins - Mi 04.12.19 15:30

user profile iconhaschme hat folgendes geschrieben Zum zitierten Posting springen:
bzw. ob es Sprachen (z.B. systemnähere Sprachen wie C++) gibt, die rein performancetechnisch gegenüber C# in diesen Bereichen immer einen deutlichen Leistungsvorteil haben?

Das ist natürlich immer subjektiv (wie viel ist "deutlich"? 20% ?) aber ja mit C++ wird es immer möglich sein, genau so schnell oder schneller zu sein als mit C#. Allerdings kostet das u.U. erheblich mehr an Entwicklungszeit und Expertenwissen!
So eine optimierung ist immer auch eine Abwägung aus Entwicklungskosten und Laufzeit.

Btw.: Statt C++ würde ich eher Rust empfehlen, das ist sicherer bzgl. Speicherverwaltung als C++.

Bei C# gab es übrigens gerade in letzter Zeit einige Performance-Sachen wie z.B. Span<T> (https://docs.microsoft.com/en-us/archive/msdn-magazine/2018/january/csharp-all-about-span-exploring-a-new-net-mainstay) die es ermöglichen, mit weniger Speicherallokationen auszukommen.