2016-05-09 22 views
6

Ho cercato di velocizzare la mia applicazione in quanto è critica dal punto di vista delle prestazioni ... ad esempio, ogni millisecondo che riesco a ottenere è meglio. Per fare questo ho un metodo che chiama alcuni altri metodi e ciascuno di questi altri metodi è avvolto con un timer Stopwatch e chiamate Console.WriteLine. Cioè .:Console.WriteLine velocizza il mio codice?

private void SomeMainMethod() 
{ 
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
    sw.Start(); 
    SomeMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

    sw.Reset(); 
    sw.Start(); 
    SomeOtherMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

    //... 
} 

Il problema è ogni volta che commentare la Stopwatch e Console.WriteLine righe il codice viene eseguito circa 20ms (non 50) più lento che è molto per quello che mi serve.

Qualcuno sa perché questo è?

EDIT: Procedimento SomeMainMethod e altri nella classe sono avvolti in un Stopwatch e Console.WriteLine chiamate simile al precedente.

Il SomeMainMethod e i metodi che chiama fanno parte di una classe che fa parte di una libreria di classi che viene chiamata da un banco di prova console, il tutto è a thread singolo.

Per ulteriori informazioni: L'app è in esecuzione in x86 .NET versione 4.6.1 Release con ottimizzazioni abilitate. Sto anche eseguendo questo in Visual Studio 2013, non al di fuori di esso.

+1

Che sembra strano strano .. Non posso dire che ho notato cambiamenti di velocità come quello – BugFinder

+1

Se non stai usando il cronometro, non stai misurando il tempo allo stesso modo. Hai giustificato questo? – stuartd

+1

@stuartd ma hes dicendo che rimuovendo il cronometro e visualizza il suo * più lento *, non più veloce? quindi c'è meno codice – BugFinder

risposta

2

Dopo aver letto un numero molto simile question senza risposte, il problema potrebbe essere stato risolto. Nella sezione commenti di un utente (ForguesR) ha così commentato:

E 'davvero un grande indovinare: forse perché si sta scrivendo per IO tuo thread ottiene più tempo del processore, perché WriteLine è sincronizzato e bloccando in tal modo altri thread.

Così ho voluto verificare se questo era davvero il caso così ho cambiato SomeMainMethod a come il seguente:

NOTA: Non è generalmente consigliato di giocare con priorità dei thread, questo solo era soluzione alternativa per testare la teoria. Vi sconsiglio vivamente di farlo nel codice di produzione, a meno che non siate sicuri al 100% di sapere cosa state facendo. Allora probabilmente starai lontano da esso.

private void SomeMainMethod() 
{ 
    System.Threading.ThreadPriority tp = System.Threading.ThreadPriority.Normal; 
    try 
    { 
     tp = System.Threading.Thread.CurrentThread.Priority; 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     sw.Start(); 
     SomeMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

     sw.Reset(); 
     sw.Start(); 
     SomeOtherMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

     //... 
    } 
    finally 
    { 
     System.Threading.Thread.CurrentThread.Priority = tp; 
    } 
} 

Dopo questa modifica il mio codice ora gira costantemente più veloce (~ 10ms) quando i Console e Stopwatch righe sono commentate. Quindi credo che il suo commento fosse probabilmente corretto, almeno nella mia situazione.

+0

Per interessi, cosa succederebbe se eseguissi SomeMethod un centinaio di volte. La mia ipotesi è che il throtling della CPU sia effettivamente il colpevole (apparentemente curato da Console.Write). Sei in modalità ad alte prestazioni? La modalità bilanciata impiegherà un secondo per "ruotare" - e sarà anche timida di velocità di turbo complete. E dici che 10ms è una quantità significativa di tempo per te, ma 10ms saranno introdotti facilmente se il codice viene eseguito su un computer più lento. – Patrick

+0

@Patrick Il mio PC è terribile quindi il codice non dovrebbe mai essere eseguito su qualcosa di peggio. E ho eseguito il codice un sacco di volte senza riavviare – TheLethalCoder