493 Stimmen

Ist DateTime.Now der beste Weg, um die Leistung einer Funktion zu messen?

Ich muss einen Engpass finden und die Zeit so genau wie möglich messen.

Ist der folgende Code-Schnipsel der beste Weg, um die Leistung zu messen?

DateTime startTime = DateTime.Now;

// Einige Ausführungsprozesse

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

0 Stimmen

Übrigens, wenn Sie nicht auf der Suche nach etwas Schnellem und Dreckigem sind, können Leistungsindikatoren verwendet werden.

1 Stimmen

Wenn Sie eine größere Genauigkeit benötigen, verwenden Sie Stopwatch.GetTimestamp, ansonsten ist die Antwort gut.

0 Stimmen

@dbasnett Können Sie in einer Antwort mehr ins Detail gehen?

14voto

rp. Punkte 17175

Verwenden Sie die System.Diagnostics.Stopwatch-Klasse.

Stopwatch sw = new Stopwatch();
sw.Start();

// Führe etwas Code aus.

sw.Stop();

// sw.ElapsedMilliseconds = die Zeit, die Ihr "etwas Code ausführen" gedauert hat.

11voto

Andrei Rînea Punkte 19502

Ditto Stopuhr, es ist viel besser.

In Bezug auf die Leistungsmessung sollten Sie auch überprüfen, ob Ihr "// Einige Ausführungsprozess" ein sehr kurzer Prozess ist.

Denken Sie auch daran, dass der erste Durchlauf Ihres "// Einige Ausführungsprozess" möglicherweise deutlich langsamer ist als nachfolgende Durchläufe.

Normalerweise teste ich eine Methode, indem ich sie 1000 Mal oder 1000000 Mal in einer Schleife ausführe, und erhalte so viel genauere Daten als bei einem einzelnen Durchlauf.

9voto

Mike Dunlavey Punkte 39339

Dies sind alles großartige Möglichkeiten, um Zeit zu messen, aber das ist nur ein sehr indirekter Weg, um Engpässe zu finden.

Der direkteste Weg, um einen Engpass in einem Thread zu finden, besteht darin, ihn zu starten und während er das tut, was Sie warten lässt, mit einer Pause- oder Unterbrechungstaste anzuhalten. Tun Sie dies mehrmals. Wenn Ihr Engpass X% der Zeit in Anspruch nimmt, besteht eine X%ige Wahrscheinlichkeit, ihn bei jedem Schnappschuss auf frischer Tat zu erwischen.

Hier ist eine ausführlichere Erklärung, wie und warum es funktioniert

7voto

Adam Haile Punkte 29829

@Sean Chambers

Zur Information: Die .NET Timer-Klasse ist nicht für Diagnosezwecke gedacht, sie generiert Ereignisse in einem voreingestellten Intervall, wie hier beschrieben (MSDN):

System.Timers.Timer aTimer;
public static void Main()
{
    // Erstellen eines Timers mit einem Intervall von zehn Sekunden.
    aTimer = new System.Timers.Timer(10000);

    // Verknüpfen des Elapsed-Ereignisses für den Timer.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Setzen des Intervalls auf 2 Sekunden (2000 Millisekunden).
    aTimer.Interval = 2000;
    aTimer.Enabled = true;

    Console.WriteLine("Drücken Sie die Eingabetaste, um das Programm zu beenden.");
    Console.ReadLine();
}

// Definieren des Verhaltens beim Auftreten des Elapsed-Ereignisses.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("Das Elapsed-Ereignis wurde ausgelöst um {0}", e.SignalTime);
}

Daher hilft dies nicht dabei zu wissen, wie lange etwas gedauert hat, sondern nur dass eine bestimmte Zeit vergangen ist.

Der Timer ist auch als Steuerelement in System.Windows.Forms verfügbar... Sie finden ihn in Ihrer Designer-Toolbox in VS05/VS08

7voto

jiya jain Punkte 71

Dies ist der richtige Weg:

using System;
using System.Diagnostics;

class Program
{
    public static void Main()
    {
        Stopwatch stopWatch = Stopwatch.StartNew();

            // etwas anderer Code

        stopWatch.Stop();

        // Dies ist nicht korrekt, um die volle Timer-Auflösung zu erhalten
        Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);

        // Richtige Methode zur genauen Erfassung der Zeit mit hoher Präzision
        Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
    }
}

Weitere Informationen finden Sie unter _Verwenden Sie Stopwatch anstelle von DataTime, um genaue Leistungsindikatoren zu erhalten_.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X