2013-06-04 45 views
4

我有一個多線程應用程序,並且在代碼特定部分我使用Stopwatch以測量操作的時間:防止上下文切換(或測量然後減去時間在線程實際上不花費)

MatchCollection matches = regex.Matches(text); //lazy evaluation 
Int32 matchCount; 
//inside this bracket program should not context switch 
{ 
    //start timer 
    MyStopwatch matchDuration = MyStopwatch.StartNew(); 
    //actually evaluate regex 
    matchCount = matches.Count; 
    //adds the time regex took to a list 
    durations.AddDuration(matchDuration.Stop()); 
} 

現在的問題是,如果程序控制切換到另一個線程的其他地方,同時啓動秒錶,然後定時時間將是錯誤的。在上下文切換回本節之前,其他線程可以完成任何工作量。

請注意,我不是問鎖,這些都是局部變量,所以沒有必要。我只想讓定時部分連續執行。

編輯:另一個解決辦法是減去上下文切換時間完成的定時部分做工作的實際時間。不知道這是否可能。

回答

3

你不能那樣做。否則,任何應用程序都可以非常容易地完全控制分配給它的CPU時間片。

你可以,但是,給你的過程高度重視,以減少上下文切換的可能性。


這裏是另一個想法:
假設你沒有衡量一個正則表達式的執行時間只是一次,而是多次,你不應該看到的平均執行時間爲一個絕對值,而是作爲一個相對值與其他正則表達式的平均執行時間進行比較。
有了這個想法,您可以比較不同正則表達式的平均執行時間,而無需知道上下文切換所損失的時間。假設環境在CPU利用率方面相對穩定,上下文切換所花費的時間在每個平均值上大致相同。

+0

謝謝。請參閱編輯。是否有可能測量和減去上下文切換時間,以獲得實際時間在定時部分中完成工作? –

+0

@DavidS .:我不知道有什麼辦法可以做到這一點。但請看更新的另一個想法。 –

+0

你的更新是一個很好的建議!我非常喜歡它。絕大多數正則表達式都很快,所以通過一些理智檢查,平均時間的相對值比我設法解決原始問題更有用。 –

2

我不認爲你可以這樣做。

「盡力而爲」,對我來說,將是把你的方法在一個單獨的線程,並使用

Thread.CurrentThread.Priority = ThreadPriority.Highest; 

避免儘可能多的上下文切換。

如果我可能會問,爲什麼你需要這樣的精確測量,爲什麼你不能提取功能,基準它自己的程序,如果是這樣的呢?

編輯:根據不同的使用情況下,它可使用

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2); // Or whatever core you want to stick to 

避免芯之間切換是有用的。

+0

關於你的問題,這將需要非常重大的架構改變。我不需要一次性的標記,因爲文本和正則表達式每次都是不同的。這可能是可能的。我寧願另一種解決方案。我需要精確的測量來檢測,以便我可以優化或刪除正則表達式,因爲緩慢的正則表達式會延遲程序並以最終會產生非常顯着的業務成本的方式加起來。我一定會嘗試threadpriority。 –

+0

那麼你也許可以使用一個分析器,它讓你看到你在每個功能:) 免費一個花多少時間(以沒有這麼多的功能不過)是SlimTune – C4stor

+0

謝謝,我用廓線儀,但我不能用它作爲這個問題的一個永遠在線的測量工具。 –