“性能分析引導(dǎo)優(yōu)化(Profile Guided Optimization,縮寫(xiě)PGO)”是一項(xiàng)原生編譯技術(shù),可用于生成高度優(yōu)化的代碼。它通過(guò)一個(gè)兩步編譯過(guò)程實(shí)現(xiàn)優(yōu)化——用第一步記錄相關(guān)執(zhí)行信息,然后第二步用那些信息構(gòu)建一個(gè)改進(jìn)過(guò)的二進(jìn)制文件。據(jù)來(lái)自微軟的Daniel Podder和Bertrand Le Roy介紹,從歷史上看,該過(guò)程的好處是改進(jìn)了二進(jìn)制代碼在鏡像中的位置,產(chǎn)生了更好的行為和引用集局部性。
在.NET Core中實(shí)現(xiàn)PGO的一個(gè)重要原因是,用戶不需要采取任何特殊的措施就可以從PGO受益,因?yàn)樗菓?yīng)用到.NET Core運(yùn)行時(shí)和JIT編譯器的。因此,它會(huì)針對(duì)特定的應(yīng)用程序根據(jù)其使用情況進(jìn)行恰當(dāng)?shù)母倪M(jìn),而托管應(yīng)用程序會(huì)自動(dòng)受益。
Podder和Le Roy表示,對(duì)于這個(gè)版本,PGO優(yōu)化已經(jīng)應(yīng)用到.NET Core運(yùn)行時(shí)的原生部分,但將來(lái),他們會(huì)把這些優(yōu)化應(yīng)用到.NET Core技術(shù)棧的托管組件。和針對(duì).NET Core 1.1的PGO優(yōu)化只適用于Windows x86不同,這些最新的優(yōu)化已經(jīng)擴(kuò)展到了Windows x64和Linux x64上。
由于一個(gè).NET Core應(yīng)用程序超過(guò)75%的啟動(dòng)時(shí)間都消耗在coreclr.dll和clrjit.dll上(在Linux上是libcoreclr.so和libclrjit.so),所以那是團(tuán)隊(duì)設(shè)法度量并改進(jìn)性能的地方。根據(jù)微軟的基準(zhǔn)測(cè)試,在Windows平臺(tái)(x64 & x86)上的改進(jìn)非常顯著,性能提升在14%到23%之間。另一方面,在Linux x64上的性能提升在2%到5%之間。這一點(diǎn)很重要,這讓我們知道啟用PGO并沒(méi)有導(dǎo)致在Linux上的性能退化,同時(shí),這也表明將來(lái)仍然有很大的改進(jìn)空間。
按照微軟新聞發(fā)言人的說(shuō)法,Windows和Linux被視為關(guān)鍵的部署目標(biāo),因此,它們會(huì)首先引入PGO技術(shù)。對(duì)于其他的平臺(tái),如macOS,他們將來(lái)會(huì)根據(jù)用戶反饋進(jìn)行考慮。
查看英文原文:Profile Guided Optimization Comes to .NET Core