![](/img/trans.png)
[英]-O2 in ICC messes up assembler, fine with -O1 in ICC and all optimizations in GCC / Clang
[英]bcc64 optimizations -O1 vs -O2 still slower than bcc32 by 40% and more
我有一個由VCL可執行文件和一個標准C ++ DLL組成的產品,這些產品都是使用C ++ Builder XE4構建的。 我以32位和64位版本發布。
在使用發布版本進行性能測試時,64位版本的運行速度要慢得多,慢40%。
我知道我需要啟用優化才能使性能測試有意義。 XE4允許我進行設置(互斥):
-O1 =最小的可能代碼-O2 =最快的可能代碼
我已經使用了其中的每一個,但是結果沒有改變。
我從這里的帖子中看到Linux / g ++程序員使用-O3(最小和最快?)(請參閱64位可執行文件的運行速度低於32位版本 )。 但是-O3不是我的環境的選擇。
我應該查看其他編譯器設置嗎?
謝謝你的幫助。
64位模式的主要缺點是指針的大小加倍。 對齊規則也可能導致類/結構更大。 也許您的代碼勉強適合32位模式下的緩存,但不適合64位模式。這特別是。 如果您的代碼使用了大量的指針,則可能會出現這種情況。
另一種可能性是,您調用了一些外部庫,並且其32位版本具有一些asm加速功能,但64位版本卻沒有。
使用探查器查看您的64位版本中實際運行緩慢的內容。 對於Windows,Intel的VTUNE也許是一個不錯的選擇。 您可以看到您的代碼在哪里有很多緩存未命中。 比較32位和64位之間的總高速緩存未命中數應該會有所啟發。
關於: -O1
與-O2
:不同的編譯器對選項的含義不同。 gcc和clang具有:
-Os
:優化代碼大小 -O0
:最小/不優化(每一步之后大多數內容都從RAM中存儲/重新加載) -O1
:進行一些優化,而無需花費很多額外的編譯時間 -O2
:更多優化 -O3
:更多優化,包括自動矢量化 Clang似乎沒有記錄其優化選項,因此我認為它與gcc相同。 (有一些選項可以報告其所做的優化 ,以及使用配置文件引導的優化。)有關優化選項的更多說明,請參見最新版本的gcc手冊(在線) :例如
-Ofast
: -O3 -ffast-math
(甚至可能是“不安全的”優化。) -Og
:在不中斷調試的情況下進行優化。 推薦用於編輯/編譯/調試周期。 -funroll-loops
:可以幫助解決一些緊密的循環,但是即使在-O3
也沒有啟用。 不要使用所有內容,因為更大的代碼大小可能會導致I緩存未命中,從而造成更大的損失。 -fprofile-use
確實啟用了此功能,因此理想情況下只使用PGO。 -fblah-blah
:還有很多更具體的選擇。 通常只使用-O3
選擇推薦的設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.