微軟調整Visual Studio x86/x64 C++編譯器的預設除錯配置,使得執行效能大幅提升,在Visual Studio 2019 16.10 Preview 2版本中,微軟透過消除不必要的執行時檢查(Runtime Checks,/RTCs)的開銷,將除錯模式編譯程式的速度提高到2到3倍。

Visual Studio在除錯模式編譯程式碼的時候,會預設將一些旗標傳遞給C++編譯器,像是/RTC1、/JMC和/ZI等,這些旗標各自有其除錯功能,但是旗標的交互作用,可能會大幅增加開銷,特別是牽涉/RTC1的時候。因此微軟透過消除不必要的開銷,來確保Visual Studio可以在抓出程式碼錯誤的同時,讓除錯體驗更加順暢。

微軟解釋,當/JMC和/ZI旗標和/RTC1合併使用時,Visual Studio會初始化分配的堆疊空間,而這項工作會占用大量CPU周期。但並非所有情況都需要進行初始化,微軟證明了在編譯時,這些檢查工作都是不必要的,並且提到,有許多C++的程式碼庫都有類似的功能,而消除檢查工作就是提升除錯效能的方法。

所有除錯效能低落的根源,都源於不必要的初始化工作,而且編譯器可以在真正需要堆疊初始化的時候,再進行初始化,對於其他情況,Visual Studio都可以安全地跳過初始化,因為在這個過程的執行時檢查,並不會找出有用的東西。

不過,當開發者使用編輯並且繼續編譯功能,情況就會變得複雜,因為開發者可以在除錯對話中,添加未初始化的變數,只有在初始化堆疊區域才能檢測到該變數。所以為了解決這個問題,微軟在除錯資訊中加入必要的位元,透過Debug Interface Access SDK公開,透過這個資訊告訴除錯器/ZI填充區開始和結束的位置,同時也告訴除錯器,該函式是否需要堆疊初始化。

如果需要初始化,那除錯器就可以在除錯對話期間,對函式的記憶體範圍無條件進行初始化,新變數將總是分配在初始化區域的頂端,而執行時檢查就會檢查新加入的程式碼安全與否。微軟對新的除錯配置進行實驗,發現所有專案的除錯效能都提高到2到3倍,使用更多STL的專案,效能可能會有更明顯的提升。


熱門新聞

Advertisement