总是设置不可能的目标
[原文地址]:https://blogs.msdn.microsoft.com/vcblog/2017/03/03/always-set-impossible-goals/
[发表时间]: 3/3/2017 Bogdan Mihalcea - MSFT
不可能的目标就像是梦想,我们总是带着梦想成真的希望在追逐。在我最近的一个体验中,我管理着一个功能组,C++快速加载项目(FPL),一个特殊的团队。就我个人而言,我对性能很感兴趣,因为我相信它使我们与心爱的机器之间的互动更让人满意。
随着时间的推移,大型代码库的增长,我们往往在使用Visual Studio时遇到低性能加载和构建。大部分的根源是来自于我们的项目系统体系结构。多年来,我们做了合理的改进,仅仅是想解决这些问题,由代码库稳定的增长率可以看出。硬件的改进,例如更好的CPU或者SSD帮助,但是它们没有产生很大的改变。
这个问题需要一个“不可能的目标”,所以我们决定把目标定很高,志在将解决方案的加载时间提高10倍! 疯了吗?不。尤其是因为多年来,我们几乎没有做出小的改进,现在目标设立好了?检查了,就开始行动,行动,行动!
几年前,当我在Visual Studio Graphics Debugger工作时,我遇到了类似的问题,加载巨大的捕获文件,需要做渲染(有时在REF驱动程序上,非常非常缓慢),这些花费了很长时间,特别是对于复杂的图形应用程序。当时,我采用了缓存机制,这使我们能够扩展和重复使用以前的计算,显著减少了重新加载的时间和内存消耗。
对于FPL,大概半年前,我们采取相似的策略。幸运的是,我们有一个好的起步从三年前我们创建的一个模型,那时我们没有时间完成的一个模型。
这一次,所有的东西都已齐备,我们能够贡献宝贵的资源实现这一点。这是一次非凡的旅程,因为我们必须以很快的速度交付,这一个功能可能会突破很多功能,而它的优点只是性能的提高。
我们开始玩非常大的解决方案,建立一个良好的基准。我们可以访问伟大的现实世界解决方案(不容易找到的,受IP约束) 以及我们内部和生成的解决方案。我们喜欢强调超出原始设计项目大小(500个项目)。这一次我们为了更好的体验推出一个“不可能的目标”(10倍的加载速度)。
主要的目标是提高解决方案的加载速度并大幅度的减少内存的消耗。在最初的设计中,我们总是在加载项目时都像第一次见到它们一样,计算它们的值并在内存中保存它们,准备编辑。从遥测数据来看,后者是完全没有必要的,因为大多数用户方案都是”只读的“ 。这是第一个大的需求,设计一个“只读的”项目系统能够向Visual Studio组件提供所需的信息,能不断地对它进行查询(Design Time工具,智能感知,项目扩展),第二个要求是确保我们尽可能的重复使用以前的负载。
我们把所有项目的“真实”加载和“评估”转变为一个out-of-proc服务,它使用SQLite存储数据并按需提供服务。这为我们提供了一个并行化项目加载的好机会,它本身也提供了巨大的性能改进。转变到out-of-proc还有一个很大的好处,减少了Visual Studio进程的内存占用,我可以轻易的加载数百MB的解决方案,甚至在GB范围的巨大解决方案 (2-3k个项目的解决方案)。这并不意味着我们只是移动内存使用到别的地方,我们实际上依赖于SQLite存储,我们不必加载MSBuild后面的重对象模型。
我们采取增量型的改进,我们根据客户对预发布产品的反馈调整和改进我们的解决方案。我们启用的第一个项目类型是Desktop,因为它是主要类型,紧接着是CLI项目类型。当所有的项目类型都不支持,将像早期版本一样”完全”加载,所以它们的功能很好,但是没有FPL的作用。
令人着迷的是,如何意外引入在原始设计不占用大量可能的负载的地方找到N ^ 2算法。他们是小的,相对于原来的大时代,但一旦我们添加缓存层,他们往往被放大。我们修复了其中的几个,并提高了性能。我们还花了大量时间尝试减少内存中大量计数对象的大小,主要是在解决方案项目内部表示。
从可用性的角度来看,我们仍然允许用户编辑他们的项目,只要他们尝试去“编辑”,我们无缝加载真正的基于MSBuild的项目,并委托给它,允许用户更改并保存它们。
我们还没有完成,我们还有很多事情要做。从用户的反馈,我们认识到我们需要强化我们的功能来保持缓存,及时在磁盘上更改时间戳(只要内容是相同的,一般情况:git分支切换,CMake重新生成)。
不可能的目标就像是魔法指南,给你长期的方向允许你打破陈规,让我们公平的把我们的思想束缚在预先存在的解决方案中!设立远大的梦想,然后努力追求!这被证明是一个伟大的策咯,因为他允许我们探索箱子之外的路径并最终产生奇妙的结果。不要期望一瞬间的满足,要实现大的成就,就要花费大量的时间,虽然目标很高,但那是值得的,但当你回头看时,你会看到你是多么接近一个不可能的梦想。