2008-10-03 107 views
4

我想做一些C#過程的基準測試,但我不想使用時間作爲我的矢量 - 我想要計算在特定方法調用中執行的IL指令的數量。這可能嗎?有沒有辦法計算執行的IL指令的數量?

編輯我說的不是方法體的靜態分析 - 我指的是執行指令的實際數量 - 所以,如果,例如,方法體包括一個循環,則將被計爲無論多少指令構成循環*循環迭代的次數都會增加。

+0

你爲什麼不想要使用時間?或者說高分辨率計時器的滴答計數?正如幾位人士指出的,並非所有IL指令都具有相同的複雜性。 – 2008-10-03 07:14:08

+0

因爲我比執行多長時間執行的指令更感興趣。 – 2008-10-03 07:28:24

+0

當然,並非所有的指令都需要相同的時間來執行?你實際上試圖優化你的代碼,使用IL指令的數量可能會產生誤導。 – hwiechers 2008-10-03 13:37:24

回答

4

我不認爲有可能做你想做的事。這是因爲IL只在JIT(Just-In-Time)編譯期間使用。在該方法運行時,IL已被翻譯成本機機器碼。因此,儘管靜態地計算給定方法/類型/程序集中IL指令的數量是可能的,但在運行時沒有這個概念。

你還沒有表明你的意圖,知道將被解釋的IL指令的數量。考慮到方法體的IL計數和機器代碼指令的實際數量之間只有鬆散的相關性,我沒有看到知道這個數字會達到什麼(除了滿足你的好奇心)。

1

好吧,這並不容易。我想認爲你可以使用在IL塊之後執行的性能計數器代碼來對你的程序集進行後編譯。例如,如果您有一段將int加載到堆棧的方法,然後在優化後的代碼中使用該int執行一個靜態方法,則可以爲int加載和調用記錄2的計數。

即使使用現有的IL /託管裝配讀/寫項目,這將是一個非常艱鉅的任務。

當然,您的計數器記錄的一些指令可能會在即時編譯到x86/ia64/x64的過程中得到優化,但這是一個風險,您必須嘗試基於摘要進行配置文件像IL這樣的語言。

1

您可以使用具有託管界面的ICorDebug。在方法開始時查找一箇中斷點,並通過編程直到它離開方法。

但是,我不確定度量標準的用處有多大,人們傾向於使用時間來處理這類問題。一些IL指令比其他指令更昂貴。

0

我使用Code Metrics在增加反射

的CodeMetrics附加分析和 計算你的組件數的代碼質量度量 。此加載項使用 反射器來計算傳統度量標準 (例如圈複雜度或更多 直接的度量值,例如方法中的局部變量數 )。 所有結果都可以保存到文件中。

安裝插件。選擇一個裝配和裝載方法指標。它會告訴你一個CodeSize,CyclomaticComplexity,指令編號等的網格。

0

我知道你不想要靜態計數。但是,每個弧的靜態IL計數加上弧一起執行的次數將爲您提供IL計數。你需要對每個弧進行測量,這需要插入一個計數器。

(弧是的,你不能在跳躍或縮小的指令序列。如果你執行的第一條指令,你永遠執行的最後,等)

相關問題