2016-05-09 3 views
6

Ich habe mich damit beschäftigt, meine Anwendung zu beschleunigen, da sie leistungskritisch ist ... d. H. Jede Millisekunde, die ich daraus bekomme, ist besser. Um dies zu tun, habe ich eine Methode, die einige andere Methoden aufruft und jede dieser anderen Methoden wird mit einem Stopwatch Timer und Anrufe eingewickelt. D.h .:Console.WriteLine beschleunigt meinen Code?

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

    //... 
} 

Das Problem ist, wenn ich die Stopwatch und Console.WriteLine Linien kommentieren Sie den Code ausgeführt wird etwa 20 ms (50) langsamer, die viel für das, was ich brauche.

Weiß jemand, warum das ist?

EDIT: Die SomeMainMethod Methode und andere in der Klasse auch in ein Stopwatch und Console.WriteLine Anrufen ähnlich wie oben eingewickelt werden. Die und die von ihr aufgerufenen Methoden sind Teil einer Klasse, die Teil einer Klassenbibliothek ist, die von einem Konsolen-Testbed aus aufgerufen wird.

Weitere Informationen: Die App läuft im x86 .NET 4.6.1 Release-Modus mit aktivierten Optimierungen. Ich betreibe das auch im Visual Studio 2013, nicht außerhalb davon.

+1

Das hört sich komisch komisch an ... Ich kann nicht sagen, dass ich Veränderungen in der Geschwindigkeit bemerkt habe – BugFinder

+1

Wenn Sie die Stoppuhr nicht benutzen, messen Sie die Zeit nicht auf die gleiche Weise. Haben Sie das berücksichtigt? – stuartd

+1

@stuartd aber hes sagt, dass durch das Entfernen der Stoppuhr und zeigt * langsamer *, nicht schneller? Also, es gibt weniger Code – BugFinder

Antwort

2

Nach dem Lesen einer sehr ähnlichen question ohne Antworten habe ich möglicherweise das Problem gefunden. In den Kommentaren ein Benutzer (ForguesR) aus dem folgenden Kommentar:

Es ist wirklich eine große Vermutung: vielleicht, weil Sie Ihren Thread mehr Prozessor schreiben IO Zeit bekommt, weil Console.WriteLine synchronisiert ist und somit andere Threads blockiert.

Also wollte ich, wenn dies überprüfen tatsächlich der Fall war, damit ich SomeMainMethod folgenden gerne geändert:

HINWEIS: Es wird in der Regel nicht mit Thread-Prioritäten zu spielen, um geraten war dies nur ein Workaround, um die Theorie zu testen. Ich würde dringend davon abraten, dies in Produktionscode zu tun, es sei denn, Sie sind 100% sicher, dass Sie wissen, was Sie tun. Dann bleib davon wahrscheinlich immer noch fern.

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

Nachdem dies meinen Code ändern läuft jetzt durchweg schneller (~ 10 ms), wenn die Console und Stopwatch Linien sind auf Kommentar. Daher glaube ich, dass sein Kommentar wahrscheinlich richtig war, zumindest in meiner Situation.

+0

Aus Interesse, was wäre, wenn Sie SomeMethod hundert Mal durchführen würden. Meine Vermutung ist, dass CPU-Throttling eigentlich der Täter ist (scheinbar von Console.Write geheilt). Bist du im Hochleistungsmodus? Der ausgeglichene Modus braucht eine Sekunde, um "hochzudrehen" - und er wird auch keine vollen Turbo-Geschwindigkeiten haben. Und Sie sagen, dass 10ms eine beträchtliche Menge an Zeit für Sie sind, aber 10ms wird leicht eingeführt, wenn der Code auf einem langsameren Computer ausgeführt wird. – Patrick

+0

@Patrick Mein PC ist schrecklich, also sollte der Code niemals auf etwas Schlimmerem laufen. Und ich habe den Code oft ohne Neustart ausgeführt – TheLethalCoder