2011-06-15 68 views
0

我創建了一個程序來計算一個變量包括表達式,如「x」,「x + 1」,「sin(x)」的積分當我在vs中調試時,我得到了很慢計算過程是F#編譯器的詭計嗎?

但是當我打開輸出執行(在倉/調試/)我得到了相當的速度處理,結果幾乎立即出現,當然等於結果的,我得到通過上述試驗

請告訴我這是什麼招,爲什麼發生?

,如果可以,請指導我的算法計算出任意VAR表達

感謝很多的整合,我愛堆棧交換了這麼多^^

回答

3

這是很正常的一個程序運行速度變慢調試模式比正常的自由執行。沒有技巧。

2

如果您在沒有從Visual Studio中調試的情況下運行,您也將獲得良好的性能。調試減慢程序速度的原因有兩方面。

首先有幾個優化,JITer可以做但不會在調試器連接時執行,這些優化使得代碼無法跨步,但輸出等效信息。

例如下面的代碼可能被JIT完全刪除(除了定義)。

int[] data = new int[10000]; 
for (int i = 0; i < data.Length; i++) 
    data[i] = 0; 

原因是數組的構造函數清除了內容,因此這個操作是多餘的。但是,在調試時,您可能需要逐步完成代碼,以便保留它。

此外,在高性能部分,由於每個其他操作都是NOP,所以通常會有50%的降速,它不做任何事情,但仍需要一個時鐘週期。這些NOP是啓用斷點的功能,但如果沒有附加調試器,則不會由JIT發出。

請注意,我所說的是泛化,編譯器和JIT的實際交互有點複雜。