Dismiss Notice

Register now to be one of the first members of this SharePoint Community! Click here it just takes seconds!

Dismiss Notice
Welcome Guest from Country Flag

总是设置不可能的目标

Discussion in 'Official Microsoft News' started by DevDivChina, Mar 27, 2017.

Thread Status:
Not open for further replies.
  1. DevDivChina

    DevDivChina Guest

    Blog Posts:
    0
    [原文地址]: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倍! 疯了吗?不。尤其是因为多年来,我们几乎没有做出小的改进,现在目标设立好了?检查了,就开始行动,行动,行动!

    [​IMG]



    几年前,当我在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后面的重对象模型。

    [​IMG]



    我们采取增量型的改进,我们根据客户对预发布产品的反馈调整和改进我们的解决方案。我们启用的第一个项目类型是Desktop,因为它是主要类型,紧接着是CLI项目类型。当所有的项目类型都不支持,将像早期版本一样”完全”加载,所以它们的功能很好,但是没有FPL的作用。

    令人着迷的是,如何意外引入在原始设计不占用大量可能的负载的地方找到N ^ 2算法。他们是小的,相对于原来的大时代,但一旦我们添加缓存层,他们往往被放大。我们修复了其中的几个,并提高了性能。我们还花了大量时间尝试减少内存中大量计数对象的大小,主要是在解决方案项目内部表示。

    从可用性的角度来看,我们仍然允许用户编辑他们的项目,只要他们尝试去“编辑”,我们无缝加载真正的基于MSBuild的项目,并委托给它,允许用户更改并保存它们。

    我们还没有完成,我们还有很多事情要做。从用户的反馈,我们认识到我们需要强化我们的功能来保持缓存,及时在磁盘上更改时间戳(只要内容是相同的,一般情况:git分支切换,CMake重新生成)。

    [​IMG]



    不可能的目标就像是魔法指南,给你长期的方向允许你打破陈规,让我们公平的把我们的思想束缚在预先存在的解决方案中!设立远大的梦想,然后努力追求!这被证明是一个伟大的策咯,因为他允许我们探索箱子之外的路径并最终产生奇妙的结果。不要期望一瞬间的满足,要实现大的成就,就要花费大量的时间,虽然目标很高,但那是值得的,但当你回头看时,你会看到你是多么接近一个不可能的梦想。

    Continue reading...
     
Thread Status:
Not open for further replies.

Share This Page

LiveZilla Live Chat Software