Visual Studio MSVC compiler/linker options (optimization and etc)

紀錄冷門參數

有些功能看起來compiler/linker都有,因為compile和link可能不是同時做
同樣的功能兩邊都有

https://blogs.msdn.microsoft.com/vcblog/2013/09/11/introducing-gw-compiler-switch/ 

Compiler
/Gw
消除重複或沒用到的global data
https://docs.microsoft.com/en-us/cpp/build/reference/gw-optimize-global-data

/Gy
消除重複或沒用到的function
https://docs.microsoft.com/en-us/cpp/build/reference/gy-enable-function-level-linking

/GL 可能會導致compile失敗 ex: ffmpeg
對整個程式做最佳化,要順便指定link /LTCG,才不會偵測到後再重跑增加效率
開了,/LTCG可以加開PGO(profile guided optimization),好像是自動產生數據去測試,未必是好的結果,建議測試過才決定要不要開

/GS- (Buffer Security Check)
關掉可以提高效能 ex: 很多執行時間短的function calls,檢查就會相對占用較多時間
https://docs.microsoft.com/en-us/cpp/build/reference/gs-buffer-security-check

/GUARD:NO (Enable Guard Checks) 目前預設是關的,可以不用下
https://docs.microsoft.com/en-us/cpp/build/reference/guard-enable-guard-checks

/favor (Optimize for Architecture Specifics)
https://docs.microsoft.com/en-us/cpp/build/reference/favor-optimize-for-architecture-specifics
除了提高效能外,目前使用發現binary有變小

/O2
預設值,針對speed最佳化
= /Og /Oi /Ot /Oy /Ob2 /GF /Gy
https://docs.microsoft.com/en-us/cpp/build/reference/o1-o2-minimize-size-maximize-speed

/Ox
use /O2 is better
https://docs.microsoft.com/en-us/cpp/build/reference/ox-full-optimization
but the /Ox compiler option enables only a subset of the speed optimization options enabled by /O2.

floatpoint的精準度
/fp:precise
/fp:fast
https://docs.microsoft.com/en-us/cpp/build/reference/fp-specify-floating-point-behavior
fast才會用FMA指令集


/Q 低階參數有些可以調整效能
https://docs.microsoft.com/en-us/cpp/build/reference/q-options-low-level-operations

/Qspectre
在VS2019 v142預設是開的...
cmake中可以下 add_compile_options("/Qspectre-") 關掉

/QIntel-jcc-erratum
針對Intel JCC bug的效能優化

/Qpar (Auto-Parallelizer)
https://docs.microsoft.com/en-us/cpp/build/reference/qpar-auto-parallelizer

/Zc (Conformance) 用語言標準或M$的行為
https://docs.microsoft.com/en-us/cpp/build/reference/zc-conformance

/permissive- (Standards conformance) 會打開一部分的/Zc
https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance

/Zc:inline
好像和inline有關,沒詳看,加快linker time

Linker
/LTCG
也有類似的功能,不過某些情況無法知道可以移除

/OPT
和/Gw, /Gy 類似,在linker做
https://docs.microsoft.com/en-us/cpp/build/reference/opt-optimizations



2018/7/08
目前/Gw 和 /favor 要自己指定沒有GUI可以開參數

/utf-8 似乎只有compile的時候有效,IDE內不算
= /source-charset:utf-8  /execution-charset:utf-8
https://docs.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8


MSVC輸出asm的方法,可以比較不同寫法
https://docs.microsoft.com/en-us/cpp/build/reference/fa-fa-listing-file

npad    5  = report nop  (nasm directive)


https://docs.microsoft.com/en-us/cpp/preprocessor/optimize?view=vs-2017
可針對function做最佳化調整
#if !DEBUG
// optimize for size
#pragma optimize( "s", on )
#endif


其他紀錄
https://docs.microsoft.com/en-us/cpp/build/reference/subsystem-specify-subsystem

留言

這個網誌中的熱門文章

OBS 抓不到畫面, 視窗, 遊戲擷取, 黑或白畫面, 當掉 ,卡住, black/white screen, window game capture, crash, freeze

優化實況(一) OBS設定 streaming settings

OBS plugin obs-text 顯示播放中音樂, display playing music