Frage

Während der Frage Überprüfen Sie, ob ein Eingang der Typ der Zeichenfolge wurde geschlossen, zwei der Antworten wurde in meinem Kopf eine mikrooptimierende Frage gestellt: Welches der folgenden zwei Lösungen würde besser funktionieren?

Reed Copsey hat ein Lösung mit Char.IsLetter :

generasacodicetagpre.

angepasst Lösung mit regex von mark byers :

generasacodicetagpre.

Ich möchte nicht einfach die Frage von Reed oder Mark fragen, dachte ich, ich würde einen schnellen Test schreiben, um zu bestimmen, was besser durchgeführt wurde. Problem ist, dass ich nicht viel Code-Optimierung getan habe (ich neige dazu, die Code-Lesbarkeit vor allem anderen einzufügen).

Andere als ein Zeitstempel vor und nach dem Lauf von jedem, was sind einige andere (bessere?) Optionen, um zu bestimmen, welche Lösung schneller läuft?

edit

Ich modifizierte Martins Antwort zur Arbeit mit Console.WriteLine(...) und lief es als Konsolenanwendung. Nicht sicher, wie linqpad Anwendungen läuft, aber die Ergebnisse waren ungefähr gleich:

generasacodicetagpre.

War es hilfreich?

Lösung

Sie möchten dies tun, um die Laufzeiten mit einem Stoppuhr .Auch hier sind einige sehr wichtige Dinge, um beim Profil zu denken:

    .
  1. Führen Sie Ihren Test immer mehr als 1 Mal aus.Das erste Mal, wenn Sie es ausführen, wird es von der JIT überhebt, und die Timings können irreführend sein.Wenn Sie viele Male laufen und den Durchschnitt unternehmen, ist ein guter Ansatz (ich betreibe oft einen Test wie diesen 100.000 Mal, zum Beispiel.)
  2. Führen Sie Ihren Test immer mit einem vollständigen Release-Build, außerhalb des Visual Studio-Hosting-Prozesses aus.(Standardmäßig können Sie CTRL + F5 dafür verwenden.) Der Visual Studio-Host wirkt sich drastisch aus.

Andere Tipps

Sie sollten den generationspflichten check out checken!

http://msdn.microsoft.com/de-us / library / system.diagnostics.stopwatch.aspx

Sie sollten die Sache oft in einer Schleife ausführen, um Timing-Fehler und andere unkontrollierbare Faktoren zu reduzieren.

hoffe das hilft.

Ich habe dies einfach zusammen in linqpad als ein Beispiel dafür, wie ich es tun würde (daher dieAnrufe zum Müll () - Ersetzen Sie mit Console.writine (...), wenn Sie dieses praktische Werkzeug nicht verwenden).

sieht aus wie der Linq-Weg ist etwas mehr als viermal schneller:

generasacodicetagpre.

Ausgang:

generasacodicetagpre.

Es gibt eine system.diagnostics.stopwatch-Klasse, die verwendet werden kann.

Welchen Code, den Sie testen, führen Sie den Test einmal aus, um die JIT-Kosten zu entfernen, und führen Sie sie erneut für die endgültigen Timings aus.Die meisten einzelnen Timing-Zählungen könnten aufgrund anderer Faktoren auf dem PC nicht repräsentativ sein - also führen Sie viele Iterationen aus und berechnen Sie dann die durchschnittliche Laufzeit daraus.

Verwenden Sie die system.diagnostics.stopwatch-Klasse.

Starten Sie den Stoppuhr und führen Sie mehrere tausend Iterationen aus, stoppen Sie es und überprüfen Sie die gesamten Millisekunden, die abgelaufen sind

Schritte, um zu bestimmen, was schneller ist: -

    .
  1. Erhalten Sie eine Sammlung von Computern, ein paar hundert Sollte, AMD / Intel / Andere, 32-Bit / 64-Bit, ...

  2. Installieren Sie jedes .NET-Framework, das Sie auf jedem von ihnen interessieren (wiederum)

  3. Versuchen Sie jede Kombination von Optimierungsoptionen für die Zusammenstellung (wiederum)

  4. Verwenden Sie Stoppuhr, um einen großen Lauf für jeden

  5. zu testen

  6. Überwachung der Speicherauslastung für jedes, da der Rest Ihres Antrags einen größeren Einfluss auf den Rest Ihrer Anwendung haben kann.Ein paar Zyklen auf Kosten für den erhöhten Speicherverbrauch sparen und mehr Müllsammelaktivität ist oft eine schlechte Optimierung.

  7. Das könnte Ihnen eine Vorstellung davon geben, wodurch in der Praxis schneller ist, zumindest für aktuelle Releases des Compilers.Wiederholen Sie mit jeder neuen Version des Compilers.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top