我創建了一個程序來計算一個變量包括表達式,如「x」,「x + 1」,「sin(x)」的積分當我在vs中調試時,我得到了很慢計算過程是F#編譯器的詭計嗎?
但是當我打開輸出執行(在倉/調試/)我得到了相當的速度處理,結果幾乎立即出現,當然等於結果的,我得到通過上述試驗
請告訴我這是什麼招,爲什麼發生?
,如果可以,請指導我的算法計算出任意VAR表達
感謝很多的整合,我愛堆棧交換了這麼多^^
我創建了一個程序來計算一個變量包括表達式,如「x」,「x + 1」,「sin(x)」的積分當我在vs中調試時,我得到了很慢計算過程是F#編譯器的詭計嗎?
但是當我打開輸出執行(在倉/調試/)我得到了相當的速度處理,結果幾乎立即出現,當然等於結果的,我得到通過上述試驗
請告訴我這是什麼招,爲什麼發生?
,如果可以,請指導我的算法計算出任意VAR表達
感謝很多的整合,我愛堆棧交換了這麼多^^
這是很正常的一個程序運行速度變慢調試模式比正常的自由執行。沒有技巧。
對於第二個問題,多元數值積分,你可以看看Monte Carlo integration。
如果要整合的函數是概率分佈,那麼您可能需要閱讀Gibbs sampling方法。
如果您在沒有從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的實際交互有點複雜。