VS2019中對C++內聯器的改進:Zipliner

2021-01-07 漫漫開發路

官一下宣

Visual Studio 2019 v16.3和v16.4包含了對C++內聯器的一系列改進,其中包含這麼一條:具備對某些經過優化後的代碼進行內聯的能力,我們稱之為」Zipliner」。根據你的應用的不同,你可能會看到一些較小的代碼質量改進或者編譯時間的顯著縮短。

C2內聯器

Terry Mahaffey在之前的一篇文章」Visual Studio’s inlining decisions」中給出了VS內聯決策的概述。以下是對於這項改進比較相關的要點:

1. 內聯器是以遞歸的方式運行的,在某些情況下,它可能會重新做它之前做過的事情。內聯決策是上下文敏感的並且它並不總是對同一個函數做出相同的決策。

2. 內聯器在工作過程中十分關注資源的消耗。所以它會在生成的可執行文件的大小和運行時性能之間做出艱難的平衡。

3. 在內聯器看來,它所面對的世界都是」未經優化」的。它並不了解隱藏在代碼背後的邏輯細節,比如Copy propagation和Dead control path之類的。

現代C++

不幸的是,現有的大多數代碼模式和慣用法都引入了泛型編程的理念。考慮如下的代碼(來自Eigen庫):

它會調用下面代碼中的innerSize函數:

outerStride實例化後實際上只是返回它的一個數據成員。因此,它會是一個極好的內聯展開對象。但是對於模塊中每一次對outerStride的調用,編譯器都必須評估和展開多達18個被它調用的函數。

這將顯著的影響編譯器的編譯時間,並大大增加了內聯器的資源消耗。另外,更壞的消息是,對」rows」和」cols」的調動都是內聯的,即使他們它們並不會被執行。

如果編譯器只是對2行成員執行內聯優化,那就會好得多了,如下所示:

對經過優化的IR進行內聯

對於有些函數,內聯器現在可以對經過優化的IR進行展開,而不需要先獲取IR然後重新展開被調用函數。這會帶來兩個好處:一是可以加快調用樹的展開,二是有助於內聯器更加精準地評估其資源消耗。

第一,優化器在第一次編譯時將作出快速展開outerStride的決定(還記得嗎,c2.dll會在編譯函數的調用者之前編譯函數本身)。然後,內聯器可能會將對outerStride的實例化調用替換為現場訪問。

這個能被快速展開的函數對象通常是一個沒有本地變量的」葉子函數」,最多只會有兩個不同的參數或者全局變量等。在實際的項目中,他們可能是一些getters或者setters。

帶來的好處

還有很多類似於outerStride的例子。如果你的代碼大量的使用到了Eigen庫,你會發現編譯時間有顯著的縮短,編譯吞吐量將有25%到50%的提升。

新的Zipliner處理提升編譯性能,同時也能讓內聯器更準確的評估資源消耗。一直以來,Eigen庫的開發者都知道MSVC不會內聯他們設立的規範(詳情請看EIGEN_STRONG_INLINE)。Zipliner的出現應該會讓他們緩解這種焦慮。

試試看!

Zipliner默認在VS2019 v16.3中啟用,同時在v16.4中得到了一些新的優化。

總結

時至今日,我還是沒有足夠的勇氣去探索編譯器的世界。還是寫幾年HelloWorld把基礎打好先吧。

感謝閱讀(畢竟不是太容易懂)。

相關焦點

  • 總結一下:VS2019中對C++20語言特性的支持
    我們的開發團隊一直都在努力工作,嘗試在MSVC工具集中實現C++20儘可能多的語言特性,在已發布的VS2019 v16.7和VS2019 v16.8中,我們取得了比較大的進展。今天,我們就來總結一下這兩個大版本中對C++20的支持情況。今天我們將特別關注MSVC編譯器(cl.exe)中實現的C++20語言特性。
  • 進度更新:VS2019 v16.8中對C++20模塊的支持
    /std:c++latest隱式包含C++模塊由於MSVC已經開始實現C++模塊標準,工具集會在任何時候都強制使用/experimental:module編譯開關。因為模塊已經被正式移入到C++20,編譯器團體做了大量的工作,終於將模塊合併到了/std:c++latest中。
  • 特性完成:VS2019 v16.8全面支持C++協程
    Standard Mode – /std:c++latest使用比C++17更新的編譯器語言版本模式時,就能實現對C現在,這是/std:c++latest,在添加了C ++ 17之後,它將繼續進入編號版本的開關。使用這種語言開關進行編譯且不帶/await時,你就可以獲得對C++20協程的嚴格支持,我們在頭文件中和std名稱空間中提供了庫級別支持。
  • 「Fatekaleid liner伊莉雅」中,伊莉雅,美遊cosplay特集!
    「Fatekaleid liner伊莉雅」中,伊莉雅,美遊cosplay特集!178動漫整編 ▪ 2020-05-12 11:38:50 「Fate/kaleid liner
  • C++20 新特性(9):指針和數組相關的兩個改進
    改進(1):將指針轉換成bool看做縮窄轉換縮窄轉換(narrowing conversion)是指會產生數據精度損失的轉換,例如從double轉換成int。早期的C++標準,指針是可以默認轉換成bool的,不算做縮窄轉換,這樣判斷是否空指針就比較便利了。
  • 總結一下:VS2019中對C+20語言特性的支持
    我們的開發團隊一直都在努力工作,嘗試在MSVC工具集中實現C++20儘可能多的語言特性,在已發布的VS2019 v16.7和VS2019 v16.8中,我們取得了比較大的進展。今天,我們就來總結一下這兩個大版本中對C++20的支持情況。 今天我們將特別關注MSVC編譯器(cl.exe)中實現的C++20語言特性。
  • QuickInfo在VS2019中的改進:顏色和在線搜索
    2項新改進Visual Studio系列中的QuickInfo提示,對於開發人員來說,是一項非常方便的特性。簡單來說,QuickInfo可以在你編寫代碼的時候,實時顯示當前編寫代碼的輔助信息,例如函數原型,數據類型等。
  • 說說VS2019 v16.8 預覽版3中的一大波更新
    偵測到一大波的在途更新對於C++開發者來說,Visual Studio 2019 v16.8 Preview 3引入了大量的更新,主要涵蓋標準化,性能改進和生產力提升C++20我們從編譯器,標準庫和IDE等各個層面對主要的C++20特性的支持做了改進。
  • 說說VS2019 v16.8 預覽版3中的一大波更新
    偵測到一大波的在途更新對於C++開發者來說,Visual Studio 2019 v16.8 Preview 3引入了大量的更新,主要涵蓋標準化,性能改進和生產力提升。下面,我們來看看。C++20我們從編譯器,標準庫和IDE等各個層面對主要的C++20特性的支持做了改進。
  • 劇場版動畫《Fate/kaleid liner 魔法少女☆伊莉雅無名的少女...
    劇場版動畫《Fate/kaleid liner 魔法少女☆伊莉雅無名的少女》2021年日本上映 時間:2020-12-18 13:12:13
  • Linux下c++使用occi連接oracle11.2資料庫
    linux下c/c++連接oracle可以使用oci、occi、Pro*C/C對象在 OCCI 中表示為 C++ 類實例,從而實現應用和資料庫之間的無縫集成。具有客戶端對象緩存的導航訪問方法提供了全面的資料庫透明性。Oracle Pro*C/C++預編譯器允許您在應用程式中使用 SQL 的電源和靈活性。方便、易用的界面可讓您的應用程式直接訪問 Oracle。與許多應用程式開發工具不同,Pro*C/C++允許您創建高度自定義的應用程式。
  • 2020-09-26:請問rust中的&和c++中的&...
    2020-09-26:請問rust中的&和c++中的&有哪些區別?福哥答案2020-09-26:變量定義:c++是別名。rust是指針。取地址和按位與,c++和rust是相同的。c++測試代碼如下:#include <iostream>struct Point { int x; int y;};int main(){ Point p1 = { 25,25 }; printf("p1.x address:%d\r\n", &p1.x); printf("p1 address
  • C/C++學習實踐利器bcw5.02(提供下載)
    筆者從學習tubroC開始,一直粉該公司的bcw2.0、bcw3.0、bcw3.1、bcw4.0、bcw4.5、bcw5.0、bcw5.02直到後來的c++build系列版本並且保存收藏。從開發現代軟體角度看,肯定選擇cbuild集成開發包,但從大中小學生學習C/C++編程看,筆者認為bcw5.02是不二選擇,幫助料足、源碼例子豐富。
  • C++20 新特性(11):lambda對this的捕捉改進
    在 C++11 標準中增加了 lambda 表達式,先簡單回顧一下 lambda 中的預設捕捉,再看 C++20 對 this 的捕捉的改進。lambda 對 this 的捕捉改進在類的成員函數中定義 lambda 時,this 指針是個特殊情況。
  • 7-Zip 15.01 alpha 發布
    該版本現已提供下載:7-Zip for 32-bit Windows:http://dl.7-zip.org/7z1501.exeorhttp://dl.7-zip.org/7z1501.msi7-Zip for 64-bit Windows x64:http://dl.7-zip.org/7z1501-x64
  • TV動畫「Fate/kaleid liner 魔法少女☆伊莉雅」OVA製作決定!
    TV動畫「Fate/kaleid liner 魔法少女☆伊莉雅」OVA製作決定! 新聞 178動漫原創 ▪ 2018-12-24 10:30:50   廣山弘・TYPE-MOON原作的動畫「Fate/kaleid liner魔法少女☆
  • 為7-zip加右鍵菜單"壓縮為*.zip"
    7-zip有一個不足,就是context menu上不能直接生成*.zip(可以直接生成*.7z)那麼有沒有辦法添加Zip快捷壓縮呢,答案是肯定的:把下文存為a.reg,雙擊導入註冊表後,就可以了注意1:只能對一個文件(或目錄)處理注意2:請確保註冊表中程序名與你的
  • VS2019: 進一步新增了C++代碼分析規則
    官宣在Visual Studio v16.8 Preview 3中,我們添加了一些新的安全編碼規則到C++ Code Analysis中,開發者可以藉助這些規則來發現一些比較常見的編碼錯誤,這些錯誤看起來會不起眼,但是由此引發的
  • Java開發之淺談ZIP壓縮中要注意的幾點
    ZIP通常使用後綴名「.zip」,它的MIME格式為 application/zip 。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放源碼的7-Zip格式。從性能上比較,RAR格式較ZIP格式壓縮率較高,但是它的壓縮時間遠遠高於Zip。
  • scratch/python/c++,小孩學編程學哪個好?
    編程貓是我國的一款優秀軟體,它模仿了scratch,並進行了大規模改進,但基本邏輯都是一樣的。編程貓的公司點貓科技獲得了多輪融資,並積極進行教材化操作,應該是很有前途的軟體。不過對於編程貓的積木設置,不少人有不同的看法。