再谈 Visual Studio 11 的性能

  • Jeff Martin
  • 侯伯薇

2012 年 4 月 4 日

话题:语言 & 开发

我们上次讨论性能的时候,微软的 Larry Sullivan 就强调,PerfWatson 对于生成可评审的性能数据很重要,那让 Visual Studio 团队可以做出改善。Sullivan 现在可以告诉大家,他的团队已经可以处理这些数据,并对 VS11 做出了特定的改变。

虚拟内存

Sullivan 首先讨论了团队对 Visual Studio 内存需求所采用的方法。他们并没有把程序转换为本地的 64 位应用程序,从而访问更多内存,而是决定把重点放在如何更有效地使用 32 位进程所提供的内存。这样,团队首先处理的是 VS 中消耗内存最多的 DLL。他们检查了 800 多个 DLL,看其中是否存在对内存低效和过度使用的情况。

消耗内存第二多的就是 VS 中各种组件所使用的本地堆结构(native heap)。除了降低内存使用之外,这次任务的过程中还发现“上百次机会,可以找到‘准备就绪’的缺陷,团队在将来可以修正它们”。

最终的结果是,“当使用 Visual Studio 载入 Web 解决方案的时候,会少载入接近 300 个 DLL 库,并节省差不多 400MB 的虚拟内存”。在报告中没有直接提到对于其他类型解决方案获得的性能提升,但是 Sullivan 在以下评论中说到:

我能够找到拥有那些现成数据的人。在 Beta 版中,对于 C++ 来说虚拟内存表现平平,但是我们会在下一个 Beta 版中做出更大改进。在 Beta 版中大概能够节省 35MB,那差不多是 12% 的提升。我们会继续为 C++ 开发者改善 Visual Studio 11。

解决方案载入时间提升

解决方案的加载时间会影响所有 VS 用户,团队通过引入异步加载解决方案来解决这个问题。微软 Visual Studio Pro 团队的 Nathan Halstead 提供了关于这个方法的信息,VS 会分两个阶段来加载项目,模式加载(Modal Loading)和后台加载(Background Loading)。

在模式加载阶段,VS11 会基于上次会话打开的文件,载入用户可能需要用到的项目。如果其他项目和打开的项目有依赖关系,那么也会在这个阶段载入。不重要的项目会被安排到后台阶段载入。

后台加载阶段会解包 UI 线程,并开始在后台处理剩余的加载任务。如果用户的动作表名需要未加载的项目,那么 VS 会在继续进行后台加载之前把那个加载过程放到前面来。

“编译 - 编辑 - 调试”循环

最后,Visual Studio Ultimate 团队的 Tim Wagner描述了对日常“编译 - 编辑 - 调试”循环所做出的改变。Wagner 说到,VS 的构建版只是要完成功能,而性能会在 VS 11 Beta 版中做出提升。不幸的是,Wagner 的说法专注于 Windows 8 上 Metro 应用程序开发的性能,那是 VS11 特定的功能,与 Visual Studio 之前版本有很大区别。

微软的首席项目经理 Ayman Shoukry 提供了关于 C++ 性能的一些暗示:

在 VC++ 的编译器和连接器方面,我们做出了多项提升, 特别是让 Dev11 的编译器可以进行多线程处理。因此,在构建某些大型内部微软产品的时候,我们看到编译时间有了很大改善。我们会发布更详细的博客,说明在 Dev11 VC++ 中做出的构建时间方面的改善。

尽管这些改善还没有完成,但 Wagner 承诺说:

这里关于进展的报告并不意味着我们已经满足于 Beta 版的性能——我们会一直努力,争取在 Dev 11 中获得更多改善。

查看英文原文:Visual Studio 11 Performance Revisited
语言 & 开发