Es gibt oft auch Probleme mit Algorithmen, normalerweise, wenn innerhalb einer Schleife etwas teuer ist. Im Allgemeinen ist das erste, was Sie tun, ein Profil Ihrer Anwendung, das Ihnen die langsamsten Teile der Anwendung anzeigt. Im Allgemeinen hängt das, was Sie tun, um Ihre Anwendung zu beschleunigen, davon ab, was Sie finden. Wenn Ihre Anwendung z. B. ein Dateisystem nachahmt, kann es sein, dass Sie die Datenbank rekursiv aufrufen, um beispielsweise den Baum zu durchlaufen. Sie können diesen Fall optimieren, indem Sie diese rekursiven Aufrufe in einen einzigen vereinfachten Datenbankaufruf ändern, der alle Daten in einem Aufruf zurückgibt.
Auch hier lautet die Antwort wie immer: "Es kommt darauf an". Weitere Beispiele und Ratschläge finden Sie jedoch in Rico Marianis Blog (ein paar Jahre zurückblicken, da sein Fokus darauf liegt) verschoben):
Es geht wirklich um Ihre Wahl in Algorithmen. In der Regel gibt es keine "Silberkugel" für die Optimierung.
Wenn Sie beispielsweise StringBuilder
anstelle von Verkettung verwenden, kann Ihr Code erheblich schneller werden, aber es gibt einen Kompromiss. Wenn Sie keine großen Mengen von Strings verketten, ist der Arbeitsspeicher und die Zeit, die zum Initialisieren von StringBuilder
benötigt werden, schlechter als die normale Verkettung. Es gibt viele Beispiele dafür, wie zum Beispiel Dictionary Caching, wie Sie in Ihrer Frage erwähnt haben.
Die einzige allgemeine Optimierung, die Sie wirklich lernen und die Sie im Laufe Ihres Tages anwenden können, ist die Leistungssteigerung durch Boxen / Unboxing (Heap vs. Stack). Um dies zu tun, müssen Sie lernen, worum es geht und wie Sie dies vermeiden oder reduzieren können.
Die MSDN-Dokumentation von Microsoft enthält zwei Artikel über die Leistung, die viele gute allgemeine Techniken enthalten (sie sind wirklich nur verschiedene Versionen desselben Artikels).
Hängt von vielen Dingen ab, wirklich.
Wenn zum Beispiel Speicher ein Problem wird und viele temporäre Objekte erstellt werden, neige ich dazu, Objektpools zu verwenden. (Ein Garbage-Collector zu haben ist kein Grund, sich nicht um die Speicherzuweisung zu kümmern). Wenn Geschwindigkeit zählt, dann kann ich unsichere Zeiger verwenden, um mit Arrays zu arbeiten.
Wie auch immer, wenn Sie zu viel mit Optimierungstechniken in einer c # / .net-Anwendung zu kämpfen haben, haben Sie wahrscheinlich die falsche Sprache / Plattform gewählt.
Ich schlage unten an
vor1. Wissen, wann StringBuilder verwendet werden soll
Sie müssen schon vorher gehört haben, dass ein StringBuilder
-Objekt beim Anhängen von Strings wesentlich schneller ist als normale Stringtypen.
The thing is StringBuilder is faster mostly with big strings. This means if you have a loop that will add to a single string for many iterations then a StringBuilder class is definitely much faster than a string type.
However if you just want to append something to a string a single time then a StringBuilder class is overkill. A simple string type variable in this case improves on resources use and readability of the C# source code.
Wenn Sie StringBuilder-Objekte und String-Typen richtig auswählen, können Sie Ihren Code optimieren.
2. Vergleichen von nicht-zeichensensitiven Strings
In einer Anwendung müssen manchmal zwei String-Variablen verglichen werden, wobei die Fälle ignoriert werden. Der verführerische und traditionelle Ansatz besteht darin, beide Zeichenfolgen in Klein- oder Großbuchstaben umzuwandeln und sie dann zu vergleichen, etwa wie folgt:
str1.ToLower() == str2.ToLower()
Das wiederholte Aufrufen der Funktion ToLower () ist jedoch ein Engpass in der Leistung. Indem Sie stattdessen die eingebaute Funktion string.Compare () verwenden, können Sie die Geschwindigkeit Ihrer Anwendungen erhöhen.
Um zu prüfen, ob zwei Zeichenfolgen gleich sind, würde der Fall folgendermaßen aussehen:
string.Compare(str1, str2, true) == 0 //Ignoring cases
Die C # string.Compare-Funktion gibt eine ganze Zahl zurück, die gleich 0 ist, wenn die beiden Zeichenfolgen gleich sind.
3. Verwenden Sie string.Empty
Dies ist nicht so sehr eine Verbesserung der Performance als eine Verbesserung der Lesbarkeit, aber es zählt immer noch als Code-Optimierung. Versuchen Sie, Zeilen wie folgt zu ersetzen:
if (str == "")
mit:
if (str == string.Empty)
Dies ist einfach eine bessere Programmierpraxis und hat keine negativen Auswirkungen auf die Leistung.
Beachten Sie, dass eine gängige Praxis darin besteht, dass das Überprüfen der Länge einer Zeichenfolge auf 0 schneller ist als der Vergleich mit einer leeren Zeichenfolge. Das mag wahr gewesen sein, wenn es keine signifikante Leistungsverbesserung mehr ist. Bleiben Sie stattdessen mit string.Empty.
4. Ersetzen Sie ArrayList durch List & lt; & gt;
ArrayList ist nützlich, wenn Sie mehrere Arten von Objekten in derselben Liste speichern. Wenn Sie jedoch den gleichen Typ von Variablen in einer ArrayList beibehalten, können Sie eine Leistungssteigerung erzielen, indem Sie List & lt; & gt; Objekte stattdessen.
Nehmen Sie die folgende ArrayList:
%Vor%Beachten Sie, dass es nur Interger enthält. Verwenden der Liste & lt; & gt; Klasse ist viel besser. Um es in eine typisierte Liste zu konvertieren, müssen nur die Variablentypen geändert werden:
%Vor%Es ist nicht erforderlich, Typen mit List & lt; & gt; zu konvertieren. Die Leistungssteigerung kann bei primitiven Datentypen wie Ganzzahlen besonders signifikant sein.
5. Verwenden Sie & amp; & amp; und || Operatoren
Wenn Sie if-Anweisungen erstellen, achten Sie einfach darauf, die Doppel-und Notation (& amp; & amp;) und / oder die doppelte oder Notation (||) zu verwenden (in Visual Basic sind dies AndAlso und OrElse).
Wenn Anweisungen, die & amp; und | muss jeden Teil der Aussage überprüfen und dann die "und" oder "oder" anwenden. Auf der anderen Seite & amp; & amp; & amp; und || Gehen Sie die Aussagen nacheinander durch und hören Sie auf, sobald die Bedingung erfüllt oder nicht erfüllt ist.
Das Ausführen von weniger Code ist immer ein Leistungsvorteil, aber es kann auch Laufzeitfehler vermeiden, berücksichtigen Sie den folgenden C # -Code:
%Vor%Wenn Objekt1 Null ist, mit dem & amp; & amp; operator, object1.runMethod () wird nicht ausgeführt. Wenn der & amp; & amp; & amp; operator wird durch & amp; ersetzt; object1.runMethod () wird ausgeführt, auch wenn object1 bereits als null bekannt ist, was eine Ausnahme verursacht.
6. Smart Try-Catch
Try-Catch-Anweisungen sind dazu gedacht, Ausnahmen zu erfassen, die außerhalb der Kontrolle des Programmierers liegen, wie beispielsweise die Verbindung mit dem Internet oder einem Gerät. Verwenden Sie eine try-Anweisung, um Code "einfach" zu halten, anstatt zu verwenden, wenn Anweisungen zur Vermeidung fehleranfälliger Aufrufe den Code wesentlich langsamer machen. Strukturieren Sie Ihren Quellcode so, dass weniger try-Anweisungen erforderlich sind.
7. Ersetzen Sie Divisionen
C # ist relativ langsam, wenn es um Divisionsoperationen geht. Eine Alternative besteht darin, Divisionen durch eine Multiplikations-Verschiebe-Operation zu ersetzen, um C # weiter zu optimieren. Der Artikel erklärt im Detail, wie man die Konvertierung durchführt.
Stellen Sie im Allgemeinen sicher, dass Sie die zeitliche Komplexität verschiedener Algorithmen verstehen, und verwenden Sie dieses Wissen, um Ihre Implementierungen mit Bedacht auszuwählen.
Insbesondere für .NET geht dieser Artikel sehr detailliert auf die Optimierung von Code ein, der für die CLR bereitgestellt wird (obwohl er auch für Java oder eine andere moderne Plattform relevant ist) und ist einer der besten Anleitungen, die ich je gelesen habe:Um den Artikel in einem Satz zu destillieren: Nichts beeinflusst die Geschwindigkeit einer .NET-Anwendung (mit sinnvollen Algorithmen) mehr als der Speicherbedarf ihrer Objekte. Seien Sie sehr vorsichtig, um Ihren Speicherverbrauch zu minimieren.
Ich würde Effective C # von Bill Wagner ( erste Ausgabe und zweite Ausgabe ). Er durchläuft eine Reihe von Sprachkonstrukten und Techniken und erklärt, welche schneller sind und warum. Er berührt auch viele Best Practices.
In den meisten Fällen bietet die Optimierung Ihres Algorithmus jedoch weitaus bessere Ergebnisse als die Verwendung einer beliebigen Sprache / Optimierungstechnik.
Tags und Links optimization .net c#