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?

0voto

Tono Nam Punkte 31244

Da mir die Genauigkeit nicht besonders wichtig ist, habe ich sie verglichen. Ich erfasse viele Pakete im Netzwerk und möchte die Zeit setzen, wann ich jedes Paket erhalte. Hier ist der Code, der 5 Millionen Iterationen testet

    int iterationen = 5000000;

    // Test mit datetime.now
    {
        var datum = DateTime.UtcNow.AddHours(DateTime.UtcNow.Second);

        var jetzt = DateTime.UtcNow;

        for (int i = 0; i < iterationen; i++)
        {
            if (datum == DateTime.Now)
                Console.WriteLine("ist es!");
        }
        Console.WriteLine($"Die Ausführung von {iterationen} Iterationen mit datetime.now ist abgeschlossen. Es dauerte {(DateTime.UtcNow - jetzt).TotalSeconds} Sekunden");
    }

    // Test mit datetime.utcnow
    {
        var datum = DateTime.UtcNow.AddHours(DateTime.UtcNow.Second);

        var jetzt = DateTime.UtcNow;

        for (int i = 0; i < iterationen; i++)
        {
            if (datum == DateTime.UtcNow)
                Console.WriteLine("ist es!");
        }
        Console.WriteLine($"Die Ausführung von {iterationen} Iterationen mit datetime.utcnow ist abgeschlossen. Es dauerte {(DateTime.UtcNow - jetzt).TotalSeconds} Sekunden");
    }

    // Test mit stopwatch
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();

        var jetzt = DateTime.UtcNow;

        for (int i = 0; i < iterationen; i++)
        {
            if (sw.ElapsedTicks == DateTime.Now.Ticks)
                Console.WriteLine("ist es!");
        }
        Console.WriteLine($"Die Ausführung von {iterationen} Iterationen mit stopwatch ist abgeschlossen. Es dauerte {(DateTime.UtcNow - jetzt).TotalSeconds} Sekunden");
    }

Die Ausgabe lautet:

Ausführung von 5000000 Iterationen mit datetime.now ist abgeschlossen. Es dauerte 0.8685502 Sekunden 
Ausführung von 5000000 Iterationen mit datetime.utcnow ist abgeschlossen. Es dauerte 0.1074324 Sekunden 
Ausführung von 5000000 Iterationen mit stopwatch ist abgeschlossen. Es dauerte 0.9625021 Sekunden

Also ist DateTime.UtcNow die schnellste, wenn Ihnen die Genauigkeit nicht besonders wichtig ist. Dies unterstützt auch die Antwort https://stackoverflow.com/a/6986472/637142 zu dieser Frage.

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