Visual Studio 2019優(yōu)化新鮮出爐:C++后端更新匯總
今天我們來匯總一下在最新版本Visual Studio 2019 16.2中開發(fā)團隊帶來的一系列有關(guān)C++后端(Backend)的更新。
構(gòu)建時間優(yōu)化
之前的一篇文章我們也講到過,VS開發(fā)團隊通過優(yōu)化構(gòu)建中的鏈接過程,來提升構(gòu)建吞吐率,減少了項目的構(gòu)建時間。通過一系列對比測試,對于大型項目的構(gòu)建,其構(gòu)建效率在DebugInfo模式下提升了近3倍(甚至更多),同時在/INCREMENTAL構(gòu)建模式下,構(gòu)建效率提升了2倍。有圖有真相:
下面是之前沒有提到過的其他優(yōu)化要點
內(nèi)聯(lián)優(yōu)化
當(dāng)一些函數(shù)內(nèi)部存在分支語句并且在一個循環(huán)里被調(diào)用的時候,這些函數(shù)將更多的采用內(nèi)聯(lián)。
代碼生成優(yōu)化
通過將一些通用的數(shù)學(xué)函數(shù)(例如:std::isnan, std::ldiv, std::lldiv)替換為內(nèi)聯(lián)的匯編指令來減少整體運行的overhead。
如果項目的目標(biāo)平臺是x86或者x64,則優(yōu)化器將識別到工作在最底層單元的迭代器指令,并對其進行FMA(Fused Multiply-Add)和constant foldeing優(yōu)化。
迭代器優(yōu)化
對于一些迭代器的單元來說,如果它的大小恰好匹配迭代器的大小,則一些小的迭代循環(huán)(通常小于12次迭代)將被優(yōu)化為:/arch:AVX。
當(dāng)自動迭代在一些包含指針變量的循環(huán)中失敗時,優(yōu)化了生成的代碼序列。
分析優(yōu)化
優(yōu)化了控制流的分析流程,一些已經(jīng)被證明返回true/false的復(fù)雜分支語句將被移除。
增加了一個新的流程敏感的嚴(yán)格指針分析過程。這個指針將在不同的場景中被處理,例如當(dāng)它在當(dāng)前作用域以外被訪問的時候,或者當(dāng)它可以被安全訪問的時候。
其他通用優(yōu)化
當(dāng)一個函數(shù)返回多個值對象時,啟用該函數(shù)的Copy Elision。
當(dāng)使用LTCG編譯時,優(yōu)化了指針相減的操作流程。請注意:在某些特殊情況下,一個指針減法操作包括一個可以被優(yōu)化掉的除法操作。
生成并簡化了針對x86或x64平臺上的FMA指令。這些包括對一些全局迭代器類型的變量啟用FMA。
優(yōu)化對C++ 20里的spaceship操作符的代碼生成過程。說到這個spaceship操作符,這里簡單說明一下:
spaceship操作符被納入到了最新的C++20標(biāo)準(zhǔn)中,可以通過啟用/std:c++latest選項啟用這個操作符。此操作符可以在一些對比函數(shù)(例如 std::strong_ordering::less)和編譯期對常量的計算過程進行更加有效常量展開。
優(yōu)化了memset代碼,具體來說,就是將展開定義內(nèi)聯(lián)替換為調(diào)用更快的CRT版本。在一些包含常量字節(jié)(例如:0xABABABAB)的循環(huán)中,也會替換為CRT版本的memset。
合并了完全相同的異常處理狀態(tài),減少了C++程序的大小。請注意,當(dāng)前這個優(yōu)化點僅可以用在FrameHandler4下。當(dāng)Visual Studio 2019 16.3發(fā)布時,這個FrameHandler4將成為默認(rèn)配置。
大白話
說了這么多對于我來說近乎天書般的優(yōu)化點,我反正是有點懵逼了,可能是因為我的功力不夠吧。
如果用白話對這篇文章的內(nèi)容做一個總結(jié)的話:行了行了,VS宇宙最強,好了吧!
總結(jié)
一如既往的:請大家試試VS2019。有任何問題,請向開發(fā)團隊寫信。