2011-07-22 59 views
0

我正在使用VS2010內置profilier 我的應用程序包含三個線程。 線程的一個非常簡單:爲什麼「最獨立工作的功能」的總和不能超過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

做探查devides結果的線程數?

在我的另一個線程上,我發現該方法佔用了34%的時間。 這是什麼意思?這是否意味着它只能在34%的時間內工作,或者幾乎可以一直工作?

在我看來,如果我有三個線程並行運行,並且如果我總結方法時間,我應該得到300%(例如,如果應用程序運行10秒,例如,這意味着每個線程運行10秒,如果有3個線程 - 它會在30秒完全)

回答

1

的問題是你測量什麼,你怎麼做到這一點。從您的問題我無法重複您的經驗實際上...

Thread.Sleep()本身電話需要非常少量的時間。它的任務是從WinAPI中調用本地函數,它將命令調度程序(負責在線程之間劃分處理器時間)調用它的用戶線程不應該安排在下一秒。在此之後,此線程在第二秒結束之前不會接收處理器時間。

但是線程在該狀態下不需要任何處理器時間。我不知道profiler如何報告這種情況。


這裏是我用實驗的代碼:

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

內部會發生什麼並不重要。剛剛測試過類似的代碼。如果使用檢測,我預計在Thread.Sleep()中有99.9%。將嘗試一些額外的線程。 –

+0

@javapowered:顯然,你是對的。 VS分析器將結果標準化爲100%。當我用'new Thread(()=> {while(x == 0)Thread.MemoryBarrier();})添加第二個線程時,Start()的結果變成了47%和53%之間的匿名lambda(顯然它是線程的例程)和'Thread.Sleep()'。 –

相關問題