2009-06-23 29 views
3

我剛剛下載了ANTS Performance Profiler from Red Gate的試用版,並正在調查我的團隊的一些代碼。我立即注意到,有一段代碼表示ANTS報告的CPU時間高達99%。爲了性能分析目的,可以忽略對WaitHandle.SignalAndWait的調用嗎?

我完全不熟悉ANTS或一般的性能分析(也就是說,除了使用我所確信的極其粗糙和皺眉的方法(例如double timeToComplete = (endTime - startTime).TotalSeconds)的自我分析外),所以我仍然在擺弄與應用程序並找出它如何使用。但我確實打電話給開發人員負責代碼,他的直接反應是「是的,這並不令我感到驚訝,但是該代碼調用了SignalAndWait [我可以看到自己,感謝ANTS],它不使用任何CPU,它只是坐在那裏等待一些事情。「他建議我簡單地忽略那些代碼,並尋找任何我能找到的東西。

我的問題:SignalAndWait是否需要無CPU開銷(如果是這樣,這怎麼可能?)是真的嗎?性能分析器認爲它佔用99%的CPU時間是否合理?我覺得這個特別好奇,因爲如果它達到99%,那就表明我們的應用程序經常是空閒的,不是嗎?然而,最近它的表現變得相當遲鈍。

就像我說過的,當談到這個工具時,我真的只是一個初學者,我對WaitHandle類一無所知。所以任何信息,以幫助我瞭解這裏發生了什麼,將不勝感激。

回答

1

WaitHandle確實會讓你的線程進入睡眠狀態。

額外的好處是你可以在這些句柄上設置超時時間,以便在一段時間後喚醒。

您也可以從另一個線程(例如應用程序出口等)發出WaitHandle信號,並立即喚醒。

我個人更喜歡一個WaitHandle的一個短暫停在具有相同超時的Thread.Sleep,當睡眠開始它必須返回之前,你可以繼續操作,而如果需要的WaitHandle可以立即恢復爲。

0

我想你可能在你的代碼中有一個嚴重的錯誤。 根據其復位模式,EventWaitHandle有2個語義。 當EventWaitHandle處於AutoReset模式時,所有等待的線程都會被阻塞,直到事件發出信號,一旦事件發出信號,其後的等待操作會重置其狀態並重新啓動線程調用等待塊。但是,如果EventWaitHandle處於ManualReset模式,它將一直保持信號狀態,直到你手動調用Reset,這意味着如果一個EventWaitHandle被髮信號並且一個線程在緊密循環中調用等待它,這個線程將會不阻止,直到復位手動對事件調用,所以認爲這hyphothetical情況

EventWaitHandle h1, h2; 
h1 = new EventWaitHandle(true, EventWaitHandle.ManualReset); // the event is already signaled. 
h2 = new EventWaitHandle(false, EventWaitHandle.ManualReset); 
while(true) 
{ 
    WaitHandle.SignalAndWait(h2,h1); 
} 

上述循環將最愛吃你的CPU的,直到其他線程調用h1.Reset(),這將使的SignalAndWait塊。

希望這會有所幫助。

欲瞭解更多信息,請查看 http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx

相關問題