天天看點

linux軟鍊到ssd會影響性能嗎,VS2019: 提升Linux IntelliSense的準确性和性能

一點小改進

這篇文章來自C++跨平台組的Principal軟體工程師Paul Maybee。

要實作C++ IntelliSense的準确性,必須要能通路到C++的頭檔案,而這些頭檔案又被C++的源檔案所引用(包含)。對于Linux下的場景,被一個Linux MSBuild工程或者一個CMake工程所引用到的頭檔案将會被Visual Studio從一台Linux裝置(可以是VM,Docker容器或者WSL系統)拷貝到Windows目錄下。然後Visual Studio将會使用這些頭檔案來提供IntelliSense功能。如果頭檔案不是正确的版本,例如它們是gcc的頭檔案,而不是clang的,或者它們是C++ 11的頭檔案而不是C++ 17的,那麼IntelliSense将不會準确地工作,同時會給使用者帶來很大的困擾。

在某些情況下,頭檔案的數量會很大,在系統間拷貝它們将會花費很長的時間。VS2019 v16.5 Preview 1提升了頭檔案拷貝的性能,對于Linux項目來說,它們得到了一個更好的IntelliSense。

遠端連接配接

當使用VS的Connection Manager建立一個遠端連接配接時,預設情況下會從遠端Linux目标機器上拷貝頭檔案到本地Windows系統上的緩存位置。這個預設行為可能不是那麼必要。在新版本中,頭檔案将會按需進行拷貝,隻有當打開一個Linux工程或者配置CMake時才會進行。拷貝的工作将會在背景進行。

linux軟鍊到ssd會影響性能嗎,VS2019: 提升Linux IntelliSense的準确性和性能

連接配接管理器的遠端頭檔案對話框界面也得到了更新。對每一個連接配接的緩存可以被啟用或者被禁用。預設情況下,連接配接的緩存将會被啟用。使用者可以選擇一個連接配接并進行如下的操作:

> 點選Update按鈕,可以按需的進行頭檔案下載下傳

> 點選Delete按鈕,可以從連接配接中删除緩存的頭檔案

> 點選Explore按鈕,可以打開緩存的位置

Linux工程屬性

為了幫助使用者來控制頭檔案的拷貝,我們添加了三個Linux工程屬性,它們分别是:

> Remote Copy Include Directories

> Remote Copy Exclude Directories

> IntelliSense Uses Compiler Defaults

linux軟鍊到ssd會影響性能嗎,VS2019: 提升Linux IntelliSense的準确性和性能

Remote Copy Include Directories

用于配置遠端Linux目标機器的拷貝源位置。這個屬性僅會影響IntelliSense的頭檔案拷貝過程,而不會影響工程編譯。它通常用在[IntelliSense Uses Compiler Defaults]被設定為false的情況。使用C++通用屬性下的[Additional Include Directories]來指定用于編譯和IntelliSense的頭檔案包含目錄。

Remote Copy Exclude Directories

用來配置遠端Linux目标機器上不需要被拷貝的目錄。通常這個屬性用于從一個包含目錄中過濾掉子目錄。例如,假設你需要拷貝/usr/include,這個目錄中含有/usr/include/boost目錄。如果你的工程不需要boost,則拷貝這個子目錄會浪費時間和磁盤空間。可以使用此屬性将boost子目錄添加到排除清單來避免非必要的拷貝。

IntelliSense Uses Compiler Defaults

這個是一個布爾标志,用來訓示編譯器是否需要查詢預設頭檔案的位置。這些預設位置将會自動進行拷貝。這個标志僅在編譯器不支援gcc-link樣式的參數時設定為false。gcc和clang編譯器都支援查詢包含目錄(例如:”g++ -x c++ -E -v -std=c++11″)。

其他會影響到頭檔案拷貝的C++工程屬性

> C/C++ General tab: C/C++編譯器的額外的包含目錄

> C/C++ Language tab: C語言和C++語言标準

在[Additional Include Directories]中配置的路徑會被IntelliSense和編譯用到。這些路徑将會自動被添加到待拷貝目錄清單中。編譯器通常會通過Platfrom Toolset的選項來自動進行填充。但是在某些情況下,提供一個更加精确的位置對于編譯器來說是必要的。例如,當clang綁定到clang v6時,可以顯式的選擇”clang 8″。編譯器将會被查詢其預設的包含目錄清單。

[C Language Standard]和[C++ Language Standard]選項用于向編譯器提供一個參數來确定需要被查詢的預設目錄。舊版本的VS會拷貝為C和Clang拷貝所有頭檔案到本地緩存。通過使用編譯器标準選項,VS可以明确的判定哪些檔案是需要拷貝的,避免了非必要的檔案拷貝。

linux軟鍊到ssd會影響性能嗎,VS2019: 提升Linux IntelliSense的準确性和性能

CMake工程屬性

CMake工程也有類似的選項來控制頭檔案拷貝,它們位于CMake配置編輯器下面的[Advanced Settings]章節,如下圖所示:

linux軟鍊到ssd會影響性能嗎,VS2019: 提升Linux IntelliSense的準确性和性能

在遠端包含目錄清單中的路徑可以連同環境變量一起被格式化為”~”,例如”/usr/include/clang8;$HOME/include;~/myinclude”。

對于CMake工程來說,編譯器名稱和語言标準是從CMake工程緩存中擷取得到。

以下兩個變量值用來确定被查詢的編譯器版本:

MAKE_C_COMPILER

CMAKE_CXX_COMPILER

而C_STANDARD (CXX_STANDARD)則被用來确定語言版本。

頭檔案拷貝

每當一個工程被打開或者上面提到的工程屬性被修改時,待拷貝的檔案集合将被計算一次。

如果遠端機器被獨立的更新,例如一個新版本gccgcc安裝了,則VS的緩存将會過期。VS将不會檢測遠端機器上的頭檔案是否變化。在這種情況下,使用者必須手動點選[Project > Scan Solution]來發起一次主動掃描。然後目标主機上的頭檔案目錄将會得到自動同步,即使是它們還沒有被拷貝到本機上。

總結

自從用上了C++ IntelliSense,寫代碼就更加順手了,你還記得大明湖畔那個Whole Tomato Software嗎?