我已經工作了,可以產生128000x128000像素的像一個迷宮,而一個C#迷宮發電機。所有的內存使用情況都已經過優化,所以我目前正在考慮加速這一代。循環中方法調用的開銷是多少?
的問題(以及更多關閉的興趣點),我發現了以下(只是一些示例代碼來說明問題):
這段代碼在我的機器上約1.4秒運行一次當pixelChanged爲空:
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
GoDrawPixel(i, y, false);
}
}
}
public void GoDrawPixel(int i, int y, Boolean enabled)
{
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, enabled));
}
}
如果下面的代碼實際上0.4秒運行速度會快
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, false));
}
}
}
}
看來,當打電話只是一個「空」的方法利用了約20%該算法使用的CPU。這不奇怪嗎?我試圖在調試和發佈模式下編譯解決方案,但沒有發現任何明顯的差異。
這意味着,每一個方法調用我在這個循環將約0.4秒放慢我的代碼。由於迷宮生成器代碼當前由許多獨立的方法調用組成,這些調用除了執行不同的動作外,還開始獲得大量的資源。
我也查了谷歌和其他職位堆棧溢出,但還沒有真正找到一個解決辦法。
是否可以自動優化這樣的代碼? (也許像Roslyn項目這樣的東西)或者我應該把所有東西放在一個大的方法?
編輯: 我也有興趣在這些2例JIT/CLR代碼差異或許有些分析。 (那麼,這個問題實際上來自)
EDIT2: 所有的代碼在釋放模式
我從來沒有聽說過inline關鍵字,但它似乎正是我需要的:),我ho PE微軟也可以將它添加到C#中。 – Devedse
看看這個:http://stackoverflow.com/questions/473782/inline-functions-in-c – Gilad
http://www.greenend.org.uk/rjk/tech/inline.html – Gilad