Frage

Ich habe eine normale asp.net Seite einen Code enthält, den ich die Ausführungszeit messen möge. Ich habe eine sehr einfache Hilfsklasse für diesen Zweck erstellt:

public class Timing
{
    private long m_ticksBefore;
    private long m_ticksAfter;

    public void Before()
    {
        m_ticksBefore = DateTime.Now.Ticks;
    }

    public void After()
    {
        m_ticksAfter = DateTime.Now.Ticks;
    }

    public void TraceTime(string note)
    {
        TimeSpan span = new TimeSpan(m_ticksAfter - m_ticksBefore);
        System.Diagnostics.Trace.Write(string.Format("\n...Timing for {0}...\nTicks: \t{1}\nMilliseconds: \t{2}\nSeconds: \t{3}\n..................", note, span.Ticks, span.TotalMilliseconds, span.TotalSeconds));
    }
}

I instanziiert ein neues Timing-Objekt und wickeln Sie den Code, den ich mit dem Vor überwachen möchten () und nach Methoden und schließlich die Tracetime () -Methode aufrufen, um das Ergebnis in das Ausgabefenster in der IDE Ausgabe.

Das Merkwürdige ist, dass die erste Anfrage an der Seite führt zu einem erwarteten Zeitpunkt Ergebnis von etwa 40 Millisekunden, aber der Seite aktualisieren (F5) gibt mir 0 Ticks der Ausführungszeit. Auch mit neuen Parametern der Seite Ausführung der Ausführung verschiedenen Codes innerhalb des überwachten Bereichs zwingen offenbart eine flaches 0.

Wenn ich System.Diagnostics.Stopwatch stattdessen bekomme ich viel realistischere Ergebnisse

Stopwatch watch1 = Stopwatch.StartNew();
//Some code to monitor
watch1.Stop();
System.Diagnostics.Trace.Write(watch1.ElapsedTicks);

Für mich scheint der Code sehr ähnlich und ich kann nicht scheinen, um herauszufinden, warum der erste Ansatz zur Ausgabe realistische Ergebnisse nicht ...

Es scheint eine Art von Optimierung Problem zu sein, die hinter der Szene ausgeführt wird, aber ich weiß es wirklich nicht bekommen. Vielleicht ist es wegen meines persönlichen Timing-Problem heißt Bett Zeit Ausgabe ...

War es hilfreich?

Lösung

Obwohl DateTime.Now eine Auflösung von 100 ns zu haben scheint, Windows-Updates eigentlich nur seine interne Uhr alle 15 ms. Deshalb, wenn Ihr Code weniger dauert als etwa 7,5 ms zu laufen, wird es offenbar überhaupt keine Zeit genommen zu haben, da im Durchschnitt müssen Sie 7,5 ms warten DateTime.Now zu ändern.

Wenn Sie ein genaueres Timing benötigen, können Sie (wie Sie gefunden haben) Stoppuhr ablesen. Dieser verwendet eine andere, genauere API Ergebnisse zu erhalten.

Bearbeiten Die MSDN-Dokumentation für DateTime.Now gibt die Auflösung als „etwa 10 ms“. Die GetTickCount API (das das gleiche System verwendet Timer) gibt seine Auflösung als „typischerweise im Bereich von 10 Millisekunden bis 16 Millisekunden“.

Offenbar ist es hardwareabhängig - Einzelprozessorsysteme sind in der Regel 10 ms, sind mehrere Prozessorsysteme typischerweise 15ms

.

Andere Tipps

Ich erlebe nicht das gleiche Problem wie Sie sind. Ich habe den folgenden Code auf eine Schaltfläche klicken Ereignis:

Timing timing = new Timing();
timing.Before();
for (int i = 0; i < 100; i++)
    Thread.Sleep(1);
timing.After();
// I altered TraceTime to receive a HttpResponse.
timing.TraceTime("this is a note", this.Response);

Die Antwort ist immer in Ihrer Nähe:

  

... Timing für dies ist ein Hinweis ... Ticks:   1000057 Millisekunden: 100,0057   Sekunden: 0,1000057 ..................

Egal, ob es ein Post zurück, nicht nach zurück ... Wenn ich die Seite aktualisiert oder nicht.

Wie verwenden Sie die Timing-Klasse?

Bearbeiten

Ich habe auch den Code oben auf der Seite laden Handler und bekam genau die gleichen Ergebnisse. Dabei spielt es keine Rolle, ob es sich um eine post-back ist, aktualisieren oder was auch immer.

Sie haben uns den Kontext zu sagen, in der der Fehler passiert ist.

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