簡體   English   中英

bcc64優化-O1 vs -O2仍然比bcc32慢40%以上

[英]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.

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