2011-06-28 55 views
19

我想了解在x64與x86中運行本機C#/ .Net 4.0應用程序時存在哪些性能差異。我理解內存考慮因素(x64尋址所有內存,x86限制爲2/4gb),以及x64應用程序將使用更多內存(所有指針都是8字節而不是4字節)的事實。據我所知,這些都不會影響時鐘指令的任何時鐘,因爲x64流水線的寬度足以處理更寬的指令。x64與x86性能注意事項.Net

是否有上下文切換性能的下降,因爲每個線程的大堆棧大小?我在評估兩者時缺少哪些性能考慮因素?

+3

你有兩個基準嗎?還是這是一個思想實驗?如果你進行基準測試,結果是什麼? –

回答

18

喬·懷特給你一些很好的理由,爲什麼你的應用程序可能會比較慢。較大的指針(因此在.NET中通過擴展引用較大的引用)將佔用更多的內存空間,這意味着較少的代碼和數據將適合緩存。

有,但是,大量的有益的考慮,您可能需要使用64:

  • 的AMD64調用約定在64默認使用的,可以是頗有幾分比標準的cdecl或STDCALL更快,許多參數在寄存器中傳遞,並使用XMM寄存器作爲浮點。

  • CLR將發出用於處理浮點運算,在64位的標量SSE指令。在x86中,它使用標準的x87 FP堆棧,這比較慢,特別是對於像ints和float之間轉換的東西。

  • 更多的寄存器意味着有更少機會,JIT將要溢出,由於他們註冊的壓力。溢出寄存器對於快速的內部循環來說可能是非常昂貴的,特別是如果函數被內聯並且在那裏引入了額外的寄存器壓力。

  • 在64位整數的任何操作可以由能夠裝配到單個寄存器,而不是被分成兩個單獨的半極大地受益。

  • 這可能是顯而易見的,但額外的內存的進程可以訪問可以說是相當有用的,如果你的應用程序是內存密集型,即使是不打的理論極限。碎片可能會導致您在達到該標記之前很長一段時間內出現「內存不足」情況。

  • RIP-相對在64就可以了,在一些情況下,reduce the size of an executable image尋址。雖然這並不直接適用於.NET應用程序,但可能會影響共享可能必須重新定位的DLL。我很想知道是否有人對.NET和託管應用程序有任何具體的信息。

除了這些,.NET運行時的64位版本似乎,至少在目前的版本中,超過86相當於進行更多的優化。內聯和內存對齊等事情似乎更頻繁地發生。事實上,後來有一個bug阻止了內聯或返回值類型的任何方法;我記得看到它固定在x64而不是x86版本。

真的,你將能夠判斷哪個更適合你的應用的唯一方法是在兩個架構上進行性能分析和測試,並比較實際結果。然而,我個人只是儘可能使用任何CPU,並避免任何固有的架構依賴。這使得構建和部署變得容易,並且當大多數用戶開始專門切換到x64時,希望有更多的未來證明。

+0

現代CPU中,寄存器的數量不會改變任何內容,因爲asm代碼被轉換爲微操作。在使用整數和內存時,通用代碼上的x64往往比x86更慢。另一方面,SSE2 FPU比x87更快。但是和往常一樣,更快*可能是改變所使用的算法(例如使用緩存或查找表),而不是CPU目標。 –

+4

擁有更多的寄存器可以改變事物。即使在x86處理器執行寄存器重命名的情況下,它也無法對有限的寄存器組強制編譯器進行顯式依賴關係做任何事情。另外,「改變算法」並不是這個問題所關心的,這就是爲什麼沒人提及它的原因。 – MikeP

5

與「x64應用程序將使用更多內存」密切相關的事實是,對於64位應用程序,您的參考位置較小(因爲所有指針大小都加倍),所以您的內存減少CPU的板載(超快速)緩存。您必須更頻繁地從系統RAM中檢索數據,這比L2甚至L1片上緩存要慢得多。