Autor Beitrag
haschme
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 52
Erhaltene Danke: 1



BeitragVerfasst: Di 03.12.19 10:46 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4439
Erhaltene Danke: 911


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 03.12.19 14: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.

Für diesen Beitrag haben gedankt: haschme
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 144
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Mi 04.12.19 09: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: 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 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.

Für diesen Beitrag haben gedankt: haschme
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 870
Erhaltene Danke: 146

Win7
VS 2013, VS2015
BeitragVerfasst: Mi 04.12.19 14: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> (docs.microsoft.com/e...-a-new-net-mainstay) die es ermöglichen, mit weniger Speicherallokationen auszukommen.

Für diesen Beitrag haben gedankt: haschme