Visual Studio 2017 性能提升和建议

[原文发表地址] Visual Studio 2017 Throughput Improvements and Advice [原文发表时间] 2018/01/4 随着C++项目的壮大和优化器的日渐复杂,编译器的编译时间,或者说是性能,逐渐成为人们关注的焦点。这是我们Visual C++组非常关注的问题,也成为了15.5版本和未来工作的重点。我想花几分钟时间来为各位总结一下我们最近为提升性能所做的特殊的更改,并且可以为你提升编译工程的性能提几点建议。 这里需要注意的是,并非所有的更改都可以提升所有场景的性能。把编译时间降低到一个期望值是一个长远的事业。最近我们开始把AAA游戏作为一个基准。未来还需要付出更多的努力。 VS工具集有三个部分需要分别改进。第一就是编译器前端,也就是c1xx.dll的执行。这是一个将cpp文件作为输入并且生成一种不依赖于中间语言的语言的工具,或者IL,即将被输入到编译器后端的内容。编译器后端也就是c2.dll。它从前端读取IL并从中生成包含真正机器代码的obj。最后是链接器,它将读取后端编译器生成的各种obj和lib,并且将他们合并生成一个最终的二进制文件。 编译器前端性能 在许多工程里,前端编译时间阻碍了整体性能的提升。幸运的是,通过直接给msbuild或者其他编译系统加/MP选项(该选项可以使cl.exe同时处理多个文件),或者甚至可以使用像incredibuild这样的工具通过分布式机器来加速。想要提升性能的第一步是在编译工程时进行高效的分布和并行。 第二步是确保你高效使用了PCH文件。一个PCH文件基本上是cl.exe 充分解析了.h文件之后的内存转储-解决了每次都需要这样做的麻烦。你会被它的作用所震惊,头文件(比如windows.h或者一些DirectX头)一旦被完全预处理会变得非常大,并且常常会成为一个后处理源文件的最主要的部分。PCH文件会开启一个新世界。这里的主要操作是只将会被频繁更改的文件包含进来,这就保证PCH会帮你改进很多性能。 最后一点建议是对#include的使用限制。在PCH文件之外,包含一个文件是一个非常昂贵的操作,这就牵扯到了在包含的路径里搜索每一个文件夹的问题。很多文件的输入输出操作,这是一个每次都要被重复的传递性操作。这就是PCH会起很大作用的原因。在微软内部,人们有很多有关“只包含你要使用的文件”的成功案例。/showInclude选项可以让你认识到包含文件是多么的昂贵,并且可以指导你只包含你需要用的东西。 最后,我想让你了解一下/Bt选项。这个选项可以显示每个文件的前端(同样也包括后端和链接时间)编译时间。它可以帮你查清性能低的原因,让你知道哪个文件需要你花时间去优化。 以下是我们为提升前端性能所做的更改。 刷新PGO计数 PGO,或者叫配置文件优化,是一种编译器后端科技,在微软被广泛使用。基本原理是你生成了一个特殊检测版本的产品,通过运行测试用例生成配置文件,基于已收集的数据进行重新编译/优化。 我们发现在编译或者优化前端二进制文件(c1xx.dll)时使用的是旧的配置文件数据。当我们重新检测或者重新收集 PGO数据时,会看到10%的性能提升。 这里我们学到的是,如果在产品中用PGO提升性能,请确保定期收集训练过的数据。 移除_assume的使用 _assume(0)给编译器后端传递一个信号, 告诉它一个特定的代码路径(也许是一个默认情况的标签,等等)无法到达。许多产品会把它包含在一个宏里,并命名为类似于UNREACHABLE这样的名字,然后执行,这样debug版本会声明这个信号,ship版本会把这个信号传递给编译器。编译器会做一些操作比如移除枝干或者转移目标声明。 这是有道理的,如果在运行时一个_assume(0)声明实际上是可到达的,结果就是生成错误代码。这会在很多不同的情况下带来很多问题(并且一些人抱怨这会引发安全问题)– 所以我们做了一个实验来看看通过重新定义一个宏来简单的移除所有的_assume(0)会带来的影响。如果回归很小,也许不值得把它放在产品中免得引发其他的问题。 令我们惊讶的是,移除_assume声明使前端性能提升了1%-2%。这就很容易做决定了。这一现象的根源就是尽管在很多情况下_assume对应优化器是一个有效的信号,但实际上它也许会阻碍其他优化(尤其是比较新的优化)。在未来的版本中我们将持续对_assume进行改进。 改进winmd文件加载 在winmd文件加载问题上我们做了很多更改,旨在提升10%的加载性能(这一项大概占总编译时间的1%)。这只会影响UWP工程。 编译器后端 编译器后端包含了优化器。这里有两个等级的性能问题,“常规”问题(在这里我们做了大量的工作希望能有1-2%的提升),和“长远”问题,这里有一个特殊的方法会导致一些优化到达了一个不合理的路径并且会花30s或者更长时间去编译 — 但是大部分人没被影响。我们关心这个并且一直为之改进。 如果你使用/Bt选项并且看到一个异常的文件花费了非正常的时间做后端编译,下一步就是在编译时使用/d2cgsummary选项。Cgsummary(或者叫代码生成概要)将会告诉你哪个函数花费的时间长。如果这个函数不在你的关键性能路径中,说明你很幸运,那么你就可以用以下的方法为该函数关闭优化: #pragma optimize(“”, off) void foo() { … } #pragma optimize(“”, on) 那么这个函数就不会被优化。和我们保持联系,我们可以帮你看看是否能修复这个问题。 除了为编译时间不正常的方法关闭优化之外,我需要提示你,使用 _forceinline时要当心。通常客户会使用forceinline让内联器做他们想做的事情,这种情况下,我的建议是尽可能的有针对性的使用。编译器后端会非常非常重视_forceinline。它会免除所有的内联预算检查(_forceinline的花费不会对内联预算不利)。这些年我们看了许多案例,以代码质量为由随意使用_forceinline是性能提神的主要阻碍。基本的,不像其他编译器,我们经常通过前端的IL内联预优化的方法。这样做有时候有利,我们为不同的内容做不同的优化,但一个弊端是,很多工作我们将无法恢复。如果你有一个很深的内联树,那么这将很快变得无法控制。这就是碰到像是Tensorflow/libsodium这样的地方编译时间过长的根源。这是我们未来版本将要着眼改进的地方。 当使用LTCG build时请了解一下iLTCG。增量LTCG是一项新科技,使用它我们只需要对LTCG…

0

Visual Studio开始支持CMake – 集成了测试浏览器,CMake 3.10

[原文发表地址] CMake Support in Visual Studio – Test Explorer Integration, CMake 3.10 [原文发表时间] 2018/01/10 我们很高兴在Visual Studio 2017 15.6 Preview 2 版本 中更新了一些新的CMake功能。在最新的预览版本中,我们改进了CTest功能与IDE的集成,包括对Google和Boost单元测试框架的各种支持。 如果你刚开始在Visual Studio中使用CMake,请查看如何开始。 CTest在Test Explorer 中支持 Google Test 和Boost.Test 自从支持了CTest的基本功能之后,我们收到的更频繁相关反馈就是Test Explorer集成。 我很高兴地宣布CTest已经完全集成到最新的Visual Studio预览版的IDE中: 通常,CMake项目中的每个CTest都将在Test Explorer中有一个条目。但是,如果仔细观察上面的截图,你可能会注意到测试更加突出。如果你的项目将Google Test或Boost.Test框架与CTest结合使用,则单个测试将在测试浏览器中列出。 对Google Test和Boost.Test的各种支持需要安装相应的测试适配器。 Google和Boost测试适配器现在包含在Visual Studio中,只要安装了C ++工作负载就会默认安装。但是,如果要升级Visual Studio的现有安装,则可能需要手动安装它们。关注更多信息,请查看如何为Google Test和Boost.Test安装测试适配器。 CTest的测试浏览器集成在没有这些适配器的情况下仍然可用,但是对个别CTest可能有限。 所有Visual Studio的测试功能现在都可以与CTest一起使用。除了可以从测试浏览器窗口查看和运行CTest之外,你还可以调试它们并计算代码覆盖率。如果你使用Google Test或Boost.Test单元测试框架,你还将获得有关失败测试(包括堆栈跟踪)的详细信息: 如果你的测试似乎从测试资源管理器中丢失,请确保你已经构建了包含它们的目标。 构建完成后就会自动检测你的测试。 CMake工具升级到 3.10 为了确保你能够使用CMake的最新功能,我们已经将Visual Studio兼容的CMake版本从3.9升级到了3.10。 你可以在CMake 3.10发行说明中找到完整的增强列表。…

0

Image Watch现在可用于Visual Studio 2017

[原文发表地址] Image Watch is now available for Visual Studio 2017 [原文发表时间] 2017/12/14 Image Watch是一个Visual Studio的扩展,它在调试本机C++代码时提供了查看内存位图的监视窗口。它内置了对OpenCV图像类型的支持(例如:CV::Mat,CV::Mat_<>,etc.)。 我们知道,对于你们中的许多人来说,这是C++调试体验的重要组成部分。我们通过调查回复,博客评论以及Reddit网站的讨论收到很多请求希望Visual Studio 2017支持这个扩展。 我们很高兴地宣布Visual Studio 2017的Image Watch现在可以在Visual Studio Marketplace 中下载。 开始使用 OpenCV 和Image Watch 你可以尝试任何OpenCV程序的图像监视。你将需要在你的开发计算机上安装OpenCV库,以便能够编译这些程序。你可以运行以下vcpkg命令来下载并在你的机器上编译OpenCV: 1. 安装vcpkg(如果你已经有可用的vcpkg安装,则跳过): git clone https://github.com/Microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat vcpkg integrate install 2. 安装 OpenCV vcpkg install opencv 如果你正在寻找一个OpenCV开始的地方,你可以使用opencv.org上Image Watch教程中提供的例子。通过选择Windows控制台应用程序模板,从文件–>新建–>项目–>Visual C++–>Windows桌面创建一个新的C++项目。然后,用上面链接的OpenCV.org示例替换C++源文件的内容。 在任何C++调试会话期间,你可以通过选择以下命令来调出Image Watch窗口: 查看>其他窗口> 图像监视菜单或 自动,监视或本地窗口>🔍旁边的任何支持的变量…

0

C++ 静态分析在Visual Studio 15.6 预览2 版本上的提高

[原文发表地址]:C++ Static Analysis Improvements for Visual Studio 2017 15.6 Preview 2 [原文作者] :凯尔里德  [原文发表时间] :2018年1月10号 对于C++ 静态分析功能我们有了一些改变,可以更快并且更容易地使用它。行为稍微改变,菜单也移动了一点,但是我们认为这个新的体验更加快速和便捷。让我们来快速了解一下这些改变。 单个文件分析 开发者在处理代码时趋向于关注一些文件。为了使你正在编辑的文件更容易地得到分析的结果,你可以对这个文件运行代码分析。这不需要你去重新生成整个项目。在修复分析警告的时候,我们认为它特别有用,因为它可以更方便的检查和重查这个文件。在分析运行之后,所有这个文件的分析警告将会出现在错误列表窗口。 如果你有一些想要检查的文件,你也来可以在解决方案管理器里选择多个文件,然后仅对这些文件运行代码分析。 更多的协助菜单 为了更容易的找到代码分析菜单,我们将使它与它们的“构建”更加对应一致。在之前的版本中,你可以在项目的“项目仅”菜单下找到代码运行分析菜单。现在这个开始分析的菜单在解决方案,项目或者一个文件的“生成”菜单的“生成X”的对话框附近。在解决方案的上下文菜单 ,在解决方案,项目,和文件的树节点下找到“分析”菜单。 生成菜单   上下文菜单   仅分析 我们从开发者那里听到运行代码分析花费的时间太长了。在之前的版本中,分析运行之前运行代码分析需要一个完整的构建和链接。现在当你运行代码分析的时候,我们不在生成代码或者进行链接。这明显地减少了分析运行的时间。 一方面的影响是你将不再看到生成的警告在分析运行的时候。在生成过程中得到的是生成的警告,在分析运行的时候得到的是代码分析运行的警告。如果你想同时看到生成和分析的警告,请在项目属性下检查“启用代码分析生成“框,然后重新生成你的项目。 C++ 核心规则检查          C++核心检查默认下是没有启用的。如果你想试着使用C++核心检查对单个的文件分析,首先必须启用项目下的扩展。 总结 这有一些简单的调整去提高C++代码分析体验。下载最新的Visual Studio 预览版,然后尝试一下。我们希望你可以感觉它在你的项目中更容易使用并且这个工具可以帮助你编辑更安全的现代C++代码。 总之,我们欢迎你的反馈。可以通过e-mail visualcpp@microsoft.com,Twitter Twitter @visualc 或者facebook Microsoft Visual Cpp上发送任何的评论。        如果你遇到了其他的问题在使用VS2017 MSVC的过程中,请通过报告问题选项通过安装程序或Visual Studio IDE本身告知我们。可以在UserVoice 上提出你的建议让我们知道。谢谢! 编程愉快。

0

Boost.Test单元测试:动态库支持和新项目模板

[原文发表地址] Boost.Test Unit Testing: Dynamic Library support and New Item Template [原文发表时间] 1/10/2018 如果您刚开始学习更多关于C ++单元测试的知识,请查看我们的指南。 我们很高兴地宣布,除了Boost.Test静态库支持,Visual Studio 2017 15.6 Preview 2现在提供了Boost.Test动态库支持和一个Boost.Test项目模板。 这意味着现在比以前更容易将Boost.Test单元测试集成到Visual Studio项目中。 Boost.Test动态库 如果您已经在使用Boost.Test动态库,则您的单元测试将立即受支持。 如果你的机器上还没有Boost.Test,获取Boost.Test动态库的最简单方法是通过vcpkg。 使用vcpkg,只需运行以下命令来安装Boost.Test,然后使其可用于所有VS项目。 我们只需要安装Boost的Boost.Test部分,但是如果您想要获得整个Boost,只需将“boost-test”替换为“boost”即可。 就这样。 现在,您可以使用Visual Studio中的Boost.Test框架无缝编写,发现和运行单元测试。 如果您不喜欢动态库,请参考本指南以使用Boost静态库。 Boost.Test项目模板 如果你的 Visual Studio 拥有Boost.Test 的集成,我们添加了一个项目模板,以便您可以快速将单元测试添加到您的项目中。 为此,请右键单击该项目,然后选择Add> New Item …> Visual C ++> Test> Boost.Test 这会自动创建一个.cpp文件,并带有一些占位符测试,这些测试将自动着色。 构建你的项目后,你可以在测试浏览器窗口中管理你的测试。 项目模板使用Boost.Test的单个头文件变量,但您可以修改路径以使用独立库变体。 随时了解更多关于Boost.Test的变型。 和我们交谈 我们一直在努力为您提供最佳的开发体验。 让我们知道你接下来想看什么。 如果遇到任何问题,请将其提交给Boost.Test…

0