2011-07-22 5 views
0

VS2010ビルトインプロファイラーを使用しています 私のアプリケーションには3つのスレッドが含まれています。 スレッドの一つは、本当に簡単です:なぜ「最も個別の仕事を持つ機能」の合計が100%を超えることはできませんか?

while (true) 
    if (something) { 
     // blah blah, very fast and rarely occuring thing 
    } 
    Thread.sleep(1000); 
} 

Visual StudioはのThread.sleepがプログラム時間の36%を取ることを報告しています。 質問は「なぜ時間の100%ではないのですか?なぜMainメソッドが時間の40%を費やすのか、私は間違いなく最初から最後までこのメソッドを実行していたのです。

enter image description here

ドゥプロファイラは、スレッドの数に結果をデバイド?

私の別のスレッドでは、そのメソッドが時間の34%を要することがわかりました。 それはどういう意味ですか?それは時間の34%しか働かないことを意味するのでしょうか、それともほとんどすべての時間に働きますか?

私は3つのスレッドが並行して実行されていて、メソッドの合計時間を300%にする必要があります(たとえば、アプリケーションが10秒間実行されると、これは各スレッドが10秒間実行されることを意味します。 3つのスレッドがある - それは完全に30秒になります)

答えて

1

質問は、あなたがそれを行う方法何測定し、んです。あなたの質問から私は実際にあなたの経験を繰り返すことができません...

Thread.Sleep()呼び出しは非常にわずかな時間を要します。そのタスクはWinAPIからネイティブ関数を呼び出して、スケジューラ(スレッド間のプロセッサ時間を分割する責任を負う)を呼び出すことで、呼び出されたユーザースレッドは次の秒間にスケジュールするべきではありません。その後、このスレッドはこの秒が終わるまでプロセッサ時間を受信しません。

スレッドは、その状態でプロセッサ時間を少しでも取ることはありません。私はこの状況がプロファイラによってどのように報告されているのか分かりません。ここ


は私が実験したコードである。

internal class Program 
{ 
    private static int x = 0; 

    private static void A() 
    { 
     // Just to have something in the profiler here 
     Console.WriteLine("A"); 
    } 

    private static void Main(string[] args) 
    { 
     var t = new Thread(() => { while (x == 0) Thread.MemoryBarrier(); }); 
     t.Start(); 

     while (true) 
     { 
      if (DateTime.Now.Millisecond%3 == 0) 
       A(); 

      Thread.Sleep(1000); 
     } 
    } 
} 
+0

profilier器具コード関数が入力されたときに測定し、出口、それらプロファイラはのThread.sleep(1000)1秒かかると考えています。 Thread.Sleep(1000) – javapowered

+0

の中で何が起こるかは関係ありません。同様のコードをテストしました。計装では、99.9%の 'Thread.Sleep()'が期待どおりになっています。追加のスレッドを追加して試してみます。 –

+0

@javapowered:明らかに、あなたは正しいです。 VSプロファイラは結果を100%に正規化します。 Start() 'の結果は匿名のラムダとの間で47%vs 53%になりました(明らかにスレッドの()ルーチン)と 'Thread.Sleep()'です。 –

関連する問題