Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich bin auf der Suche nach einem Weg, um Benchmark-Methode ruft in C #.

Ich habe eine Datenstruktur für die Universität Zuweisung codiert und kam nur mit einem Weg nach oben ein wenig zu optimieren, aber in einer Weise, die ein wenig Overhead in allen Situationen hinzufügen würde, während ein O (n) Drehen rufen in O (1) in einigen.

Jetzt möchte ich beide Versionen gegen den Testdaten laufen, um zu sehen, ob es sich lohnt, die Optimierung der Umsetzung. Ich weiß, dass in Ruby, Sie den Code in einem Benchmark-Block wickeln konnten und haben es die Zeit Ausgang benötigt, um den Block in der Konsole auszuführen - gibt es so etwas wie die für C # verfügbar

Andere Tipps

Stolen (und modifiziert) von Yuriy Antwort:

private static void Benchmark(Action act, int iterations)
{
    GC.Collect();
    act.Invoke(); // run once outside of loop to avoid initialization costs
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine((sw.ElapsedMilliseconds / iterations).ToString());
}

Oft ist eine besondere Methode hat einige Dinge zu initialisieren, und Sie wollen nicht immer die Initialisierung Kosten in Ihrem gesamten Benchmark aufzunehmen. Außerdem möchten Sie die gesamte Ausführungszeit durch die Anzahl der Iterationen zu unterteilen, so dass Ihre Schätzung mehr oder weniger unabhängig von der Anzahl der Iterationen ist.

Ich habe die meisten der folgenden von Jon Skeet-Methode für das Benchmarking:

private static void Benchmark(Action act, int interval)
{
    GC.Collect();
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < interval; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

Hier sind einige Dinge, die ich durch Versuch und Irrtum gefunden.

  1. Entsorgen Sie die erste Charge von (in Tausend) Iterationen. Sie werden höchstwahrscheinlich durch den Jitter beeinflusst werden.
  2. Ausführen der Benchmark auf einem separaten Thread Objekt kann bessere und stabilere Ergebnisse liefern. Ich weiß nicht, warum.
  3. Ich habe einige Leute aus irgendeinem Grund mit Thread.Sleep gesehen vor der Benchmark ausführt. Dies wird nur noch schlimmer machen. Ich weiß nicht, warum. Möglicherweise aufgrund des Jitters.
  4. laufen Sie nie die Benchmark mit Debugging aktiviert. Der Code wird höchstwahrscheinlich laufen um Größenordnungen langsamer.
  5. Kompilieren Sie Ihre Anwendung mit allen aktivierten Optimierungen. Einiger Code kann drastisch durch Optimierung beeinflusst werden, während anderer Code wird nicht sein, also ohne Optimierung Kompilieren wird die Zuverlässigkeit Ihrer Benchmark beeinflussen.
  6. Beim Kompilieren mit Optimierungen aktiviert ist, ist es manchmal notwendig, um irgendwie die Ausgabe der Benchmark zu bewerten (z Wert drucken, etc). Andernfalls wird der Compiler sie ‚herausfinden‘ einige Berechnungen sind nutzlos und wird einfach nicht durchführen kann.
  7. Invocation der Delegierten können spürbar Overhead, wenn bestimmte Benchmarks durchführen. Es ist besser, mehr als eine Iteration innerhalb der Delegierten zu setzen, so dass der Aufwand auf dem Ergebnis der Benchmark nur geringe Auswirkungen hat.
  8. Profilometer kann ihren eigenen Kopf hat. Sie sind gut bei Ihnen zu sagen, welche Teile des Codes Engpässe sind, aber sie sind nicht gut tatsächlich Benchmarking zwei verschiedene Dinge zuverlässig.
  9. Im Allgemeinen Phantasie Benchmarking-Lösungen bemerkbar Overhead. Zum Beispiel, wenn Sie viele Objekte mit einer Schnittstelle zur Benchmark wollen, kann es verlockend sein, jedes Objekt in einer Klasse zu wickeln. Beachten Sie jedoch, dass der Konstruktor der Klasse auch Overhead hat, die berücksichtigt werden müssen. Es ist besser, alles so einfach und direkt wie möglich zu halten.

Klingt wie Sie einen Profiler möchten. Ich würde die EQATEC Profiler mich sehr empfehlen, es ist die beste kostenlose, die ich ausprobiert habe. Das Schöne an dieser Methode über eine einfache Stoppuhr ist, dass es auch eine Aufschlüsselung der Leistung über bestimmte Methoden / Blöcke zur Verfügung stellt.

Profilometer geben die beste Benchmarks, da sie die gesamten Code zu diagnostizieren, sie es aber langsam viel nach unten. Profilometer sind für die Suche nach Engpässen verwendet.

Für einen Algorithmus zu optimieren, wenn Sie wissen, wo die Engpässe sind, verwenden Sie ein Wörterbuch des Namens -> Stoppuhr, um den Überblick über die Performance kritische Abschnitte während der Laufzeit

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