2016-05-09 13 views
6

私はパフォーマンスが重視されるため、アプリケーションの高速化を検討しています。つまり、1ミリ秒ごとに抜け出すことができます。これを行うには、いくつかの他のメソッドを呼び出すメソッドがあり、これらのメソッドのそれぞれはStopwatchタイマーとConsole.WriteLineコールでラップされます。すなわち:私は、コードが実行さStopwatchConsole.WriteLine行をコメントアウトたびConsole.WriteLineは自分のコードをスピードアップしますか?

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

    //... 
} 

問題は約20msの(いない50)私は必要なもののためにたくさんある遅くなります。

これはなぜですか?

EDIT:クラス SomeMainMethod方法等はまた、上記と同様StopwatchConsole.WriteLineコールに包まれています。

SomeMainMethodが呼び出すメソッドは、コンソールテストベッドから呼び出されるクラスライブラリの一部であるクラスの一部であり、すべてがシングルスレッドです。

詳細情報:このアプリケーションは、x86 .NET 4.6.1リリースモードで実行され、最適化が有効になっています。私はまた、これ以外の視覚スタジオ2013でこれを実行しています。

+1

そんなに奇妙に聞こえます。スピードの変化に気付いていません。 – BugFinder

+1

ストップウォッチを使用していない場合は、同じ方法で時間を測定していません。あなたはそれを説明しましたか? – stuartd

+1

@stuartdしかし、ストップウォッチを取り除くことによってそのスピードは遅くなっていますか?のでコードless37 – BugFinder

答えて

2

非常によく似たquestionを読んだ後、私はこの問題を発見したかもしれません。それは本当に大きな推測です

:あなたのスレッドをIOに書いているかもしれないので、WriteLineメソッドが同期ので、他のスレッドをブロックしているため、より多くのプロセッサ時間を取得しますコメント欄では、ユーザ(ForguesR)は、以下のコメントをしました。

だから、私は次のようにしSomeMainMethodを変更するので、これは確かにそうであったかどうかを確認したかった:

NOTE:一般的にスレッドの優先順位で遊んすることをお勧めされていないが、これが唯一でした理論をテストするための回避策。あなたが何をしているのかを100%確信していない限り、私は生産コードでこれを行うことを強くお勧めします。おそらくまだそれから離れているでしょう。 ConsoleStopwatch行がコメントアウトされている場合、これは今、私のコードを変更行った後

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

は(〜10ms)の一貫速く実行されます。したがって私は彼のコメントが少なくとも私の状況では正しいと信じています。

+0

興味のあることから、SomeMethodを100回実行するとどうなりますか?私の推測では、CPUスローリングは本質的に(Console.Writeによって一見治癒された)原因です。ハイパフォーマンスモードですか?バランスのとれたモードでは、1秒で「スピンアップ」することができます。また、完全なターボスピードにも夢中になります。 10msはかなりの時間ですが、遅いコンピュータでコードを実行すると10msが簡単に導入されます。 – Patrick

+0

@パトリック私のPCはひどいので、悪質なコードは絶対に実行しないでください。そして、私はコードを再起動せずに何度も実行しました – TheLethalCoder

関連する問題