Jeff Martin撰寫了一系列關于Visual Studio “15”性能分析的文章。在他的上一篇文章《Visual Studio “15”的啟動優化》中曾提到,微軟已承諾全面提升Visual Studio “15” IDE的性能。本文將從內存處理的角度,探討他們在Technical Preview 5(TP5)中所做的提升:在主程序保留為一個32位進程的同時,將部分關鍵組件遷移到微軟獨有的進程。
在微軟任職的Ashok Kamath針對這些改變在《Visual Studio “15”的內存溢出崩潰減少優化》一文中做了更多的介紹,以便能從更全面的視角來看待這些改變。他提供了一種方法來度量微軟開發團隊所作出的改進。他提供了2個不同的指標:虛擬內存峰值PVM(Peak Virtual Memory)和個人工作集峰值PPWS(Peak Private Working Set)。PVM指的是VS15主進程所占用的總內存數。由于主進程是32位的,因此它的最大值被限制為4GB內存。PPWS指的是VS15的devenv.exe和相關進程所占用的物理內存數。
首先被移出VS15主進程的是JavaScript語言服務。JavaScript語言服務提供智能提示、代碼導航等功能。新的JavaScript服務由一個獨立的Node.js進程協同VS15提供對JavaScript和TypeScript的支持。Kamath團隊通過在VS 2015 Update 3(Visual Studio之前的一個版本)和VS15 Preview 5中加載WebSpaDurandal方案來測量新服務的性能影響。在VS15 Preview 5中,PVM占用量大約減少了33%,但是PPWS的占用量減少得非常少,幾乎可以忽略不計。
第二個內存優化的部分是關于調試器中的符號加載。縱觀Visual Studio的近期發布歷史,他們已經通過高侵入性地從PDB文件中預加載符號數據來讓C++調試器運行地更快。但是這個方案有一個弊端,那就是會消耗大量的內存。在VS15中,這個預加載功能被重寫。新的預加載功能致力于只加載需要的信息而不是像之前那樣“大而全”地加載。為了測量這一改進,Kamath團隊用VS 2015 Update 3和VS15 Preview 5打開Unreal Engine方案,并使用調試器調試Unreal Engine進程。結果,VS 2015 Update 3不能執行這個操作,因為它會因為內存溢出錯誤而崩潰;TP5可以執行這個操作,占用大約3GB PVM和大約1.8GB PPWS。
第三個被移出主進程的是關于Git的組件。Visual Studio的先前版本使用libgit2庫,但是在TP5中改用git.exe。通過使用Chromium包測量這個改進,發現在TP5中VS主進程占用了0GB PVM,而VS2015占用了大約300B PVM。至于PPWS的占用量,兩者大致相當。
盡管測量工具已經提供了一些內存占用量減少的證據,但是開發者們獲知這一消息后,針對微軟采用的一些方案提出了許多問題。首先提到的是,更頻繁的內存交換可能導致可用性下降。另外,一位名為“Syka”的評論者提出,盡管從主進程中移出部分組件會解除內存占用方面的限制,但是可能會造成潛在的性能下降。因為跨進程的進程通信相對于原來的進程內部的組件調用來說,會造成更高的通信成本。此外,一些評論者提到,Visual Studio的真實問題并不是內存占用,而是由于主進程是32位而導致的尋址空間的稀缺。為此,他們再次呼吁微軟能夠開發64位版本的Visual Studio(詳情可參考《讓VS擴展支持64位》)。
作者簡介
Jeff Martin擁有密歇根大學的MBA學位,曾在金融領域有所建樹,但是為了緊隨時代潮流,毅然投身計算機產業。他在業余時間喜歡和妻子一起旅行,閱讀和編程。他剛著作了一本新書,《Visual Studio 2013 Cookbook》。可以在Twitter上關注他,http://twitter.com/jeffemartin。
查看英文原文:Addressing Visual Studio 15's Memory Usage