簡體   English   中英

x64 與 x86 Performance Considerations.Net

[英]x64 vs x86 Performance Considerations .Net

我試圖了解在 x64 與 x86 中運行本機 C# /.Net 4.0 應用程序時存在哪些性能差異。 I understand the memory considerations (x64 addressing all memory, x86 limited to 2/4gb), as well as the fact that an x64 app will use more memory (all pointers are 8 bytes instead of 4 bytes). 據我所知,這些都不應該影響時鍾指令的任何時鍾,因為 x64 管道足夠寬,可以處理更廣泛的指令。

由於每個線程的堆棧大小較大,上下文切換是否會影響性能? 在評估兩者時,我缺少哪些性能注意事項?

Joe White 為您提供了一些很好的理由說明您的應用程序可能會變慢。 在 memory 中,更大的指針(因此擴展而來的 .NET 中更大的引用)將占用更多空間,這意味着更少的代碼和數據將適合緩存。

但是,您可能希望使用 x64 有很多有益的原因:

  • 在 x64 中默認使用 AMD64 調用約定,並且可以比標准的 cdecl 或 stdcall 快很多,許多 arguments 在寄存器中傳遞並使用 XMM 寄存器進行浮點運算。

  • CLR 將發出標量 SSE 指令以處理 64 位中的浮點運算。 在 x86 中,它依賴於使用標准的 x87 FP 堆棧,這有點慢,特別是對於諸如在整數和浮點數之間轉換的事情。

  • 擁有更多寄存器意味着 JIT 由於寄存器壓力而不得不溢出它們的可能性要小得多。 對於快速內部循環,溢出寄存器的成本可能相當高,特別是如果 function 內聯並在那里引入額外的寄存器壓力。

  • 對 64 位整數的任何操作都可以通過放入單個寄存器而不是分成兩個單獨的部分而受益匪淺。

  • 這可能很明顯,但是如果您的應用程序是內存密集型的,即使它沒有達到理論限制,您的進程可以訪問的額外 memory 也會非常有用。 碎片化可能會導致您在達到該標記之前很久就遇到“內存不足”的情況。

  • 在某些情況下,x64 中的 RIP 相對尋址可以減小可執行映像的大小 雖然這並不真正直接適用於 .NET 應用程序,但它可能會影響 DLL 的共享,否則可能必須重新定位。 我很想知道是否有人對此有任何關於 .NET 和托管應用程序的具體信息。

除此之外,至少在當前版本中,.NET 運行時的 x64 版本似乎比 x86 等效版本執行了更多優化。 內聯和 memory alignment 之類的事情似乎發生得更頻繁。 事實上,不久前有一個錯誤阻止了任何采用或返回值類型的方法的內聯。 我記得看到它在 x64 中修復,而不是 x86 版本。

確實,您能夠判斷哪個更適合您的應用程序的唯一方法是對兩種架構進行分析和測試並比較實際結果。 但是,我個人只是盡可能使用 Any CPU,並避免任何本質上依賴於架構的東西。 這使得構建和部署變得容易,並且當大多數用戶開始專門切換到 x64 時,有望成為未來的證明。

與“x64 應用程序將使用更多內存”密切相關的事實是,對於 64 位應用程序,您的引用位置更小(因為您的所有指針大小都加倍),因此您從 CPU 上獲得的里程更少 -板(超快)緩存。 您必須更頻繁地從系統 RAM 中檢索數據,這比 L2 甚至 L1 片上緩存要慢得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM