Domanda

Ho una normale pagina asp.net contenente del codice di cui voglio misurare il tempo di esecuzione. Ho creato una classe di supporto molto semplice per questo scopo:

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));
    }
}

Ho un'istanza di un nuovo oggetto Timing e ho racchiuso il codice che desidero monitorare con i metodi Before () e After e infine chiamo il metodo TraceTime () per inviare il risultato alla finestra di output nell'IDE.

La cosa strana è che la prima richiesta alla pagina provoca un risultato di temporizzazione atteso di circa 40 millisecondi, ma l'aggiornamento della pagina (F5) mi dà 0 tick di tempo di esecuzione. Anche l'esecuzione della pagina con nuovi parametri che impongono l'esecuzione di codice diverso all'interno dell'area monitorata rivela un valore 0.

Se invece utilizzo System.Diagnostics.StopWatch ottengo risultati molto più realistici

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

Per me il codice sembra molto simile e non riesco a capire perché il primo approccio non riesce a produrre risultati realistici ...

Sembra essere una sorta di problema di ottimizzazione che viene eseguito dietro le quinte, ma in realtà non capisco. Forse è dovuto al mio problema di sincronizzazione personale, ad esempio il problema di andare a dormire ...

È stato utile?

Soluzione

Anche se DateTime.Now sembra avere una risoluzione di 100 ns, Windows in realtà aggiorna solo il suo orologio interno ogni 15 ms. Pertanto, se l'esecuzione del codice impiega meno di circa 7,5 ms, sembrerà che non ci sia voluto affatto tempo, dal momento che in media devi aspettare 7,5 ms per DateTime.Oow to change.

Se hai bisogno di tempi più precisi, puoi (come hai trovato) usare StopWatch. Questo utilizza un'API diversa e più accurata per ottenere risultati.

EDIT La Documentazione MSDN per DateTime.Now fornisce la risoluzione come "circa 10ms". L'API GetTickCount (che utilizza lo stesso sistema timer) fornisce la sua risoluzione come "tipicamente nell'intervallo da 10 millisecondi a 16 millisecondi".

Apparentemente dipende dall'hardware: i sistemi a processore singolo sono in genere 10 ms, i sistemi a processore multiplo sono in genere 15 ms.

Altri suggerimenti

Non sto riscontrando lo stesso problema. Ho inserito il seguente codice in un evento clic pulsante:

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);

La risposta è sempre vicina a:

  

... Il tempismo per questa è una nota ... Segni di spunta:   1000057 Millisecondi: 100.0057   Secondi: 0,1000057 ..................

Non importa se si tratta di un post back, non di post post ... Se ho aggiornato la pagina o meno.

Come stai usando la classe Timing?

Modifica

Ho anche inserito il codice sopra nel gestore del caricamento della pagina e ho ottenuto gli stessi esatti risultati. Non importa se si tratta di post-back, aggiornamento o altro.

Devi dirci il contesto in cui si sta verificando l'errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top