我们今天很高兴地宣布 C++构建洞察力SDK 一个框架,它通过C和C++ API提供对MSVC构建时间信息的访问。为了配合这次释放,我们正在 GitHub上的vcperf开源 . 因为 vcperf公司 它本身是用SDK构建的,您可以在开发自己的工具时使用它作为参考。我们很高兴看到您将使用SDK构建什么样的应用程序,我们期待收到您的反馈!
背景
去年11月,我们介绍 vcperf及其Windows性能分析器(WPA)插件 帮助MSVC用户了解他们的构建时间。这两个组件都是在C++构建的见解下宣布的。但是C++的构建洞察力是什么呢?
我们已经在十一月涵盖C++构建的见解是基于 Windows事件跟踪 (ETW),Windows操作系统中提供的方便的跟踪机制。但是对于我们的技术,以扩大到非常大的C++构建由我们的客户,ETW是不够的。我们需要微调事件模型和使用的分析算法。这项工作为MSVC提供了一个新的数据分析平台,我们现在称之为C++构建的见解。
今天,C++构建洞察力平台是什么力量 vcperf公司 以及我们的一些内部工具。然而,我们也想给你们所有人一个从中受益的机会。为此,我们将它打包在C和C++接口后面,以创建一个成熟的软件开发工具包。
从C++构建洞察SDK开始
使用C++构建洞察力SDK来构建适合您的场景的自定义工具:
- 以编程方式而不是通过WPA分析跟踪。
- 将构建时分析添加到持续集成(CI)中。
- 或者只是玩得开心!
下面是如何开始使用SDK的。此示例演示如何构建一个程序,该程序列出了生成所需时间超过500毫秒的所有函数。
- 下载并安装 Visual Studio 2019 .
- 获取你的建筑痕迹。
- 为VS2019启动x64本机工具命令提示符。
- 运行以下命令:
vcperf /start MySessionName
- 从任何地方构建您的C++项目,甚至从VisualStudio中构建 vcperf公司 收集系统范围内的事件)。
- 运行以下命令:
vcperf /stopnoanalyze MySessionName outputFile.etl
. 这将保存outputFile.etl中生成的跟踪。
- 启动VisualStudio并创建新的C++项目。
- 右键单击项目名称,选择 管理NuGet包… 并从官方NuGet.org feed安装最新的Microsoft.Cpp.BuildInsights NuGet包。系统将提示您接受许可证。
- 键入以下代码。
- 通过传递outputFile.etl的路径作为第一个参数来构建和运行。
#include <iostream> #include <CppBuildInsights.hpp> using namespace Microsoft::Cpp::BuildInsights; using namespace Activities; class LongCodeGenFinder : public IAnalyzer { public: // Called by the analysis driver every time an activity stop event // is seen in the trace. AnalysisControl OnStopActivity(const EventStack& eventStack) override { // This will check whether the event stack matches // TopFunctionsFinder::CheckForTopFunction's signature. // If it does, it will forward the event to the function. MatchEventStackInMemberFunction(eventStack, this, &LongCodeGenFinder::CheckForLongFunctionCodeGen); // Tells the analysis driver to proceed to the next event return AnalysisControl::CONTINUE; } // This function is used to capture Function activity events that are // within a CodeGeneration activity, and to print a list of functions // that take more than 500 milliseconds to generate. void CheckForLongFunctionCodeGen(CodeGeneration cg, Function f) { using namespace std::chrono; if (f.Duration() < milliseconds(500)) { return; } std::cout << "Duration: " << duration_cast<milliseconds>( f.Duration()).count(); std::cout << " Function Name: " << f.Name() << std::endl; } }; int main(int argc, char *argv[]) { if (argc <= 1) return -1; LongCodeGenFinder lcgf; // Let's make a group of analyzers that will receive // events in the trace. We only have one; easy! auto group = MakeStaticAnalyzerGroup(&lcgf); // argv[1] should contain the path to a trace file int numberOfPasses = 1; return Analyze(argv[1], numberOfPasses, group); }
我们的网站上还提供了这个示例的可克隆和可构建版本 C++构建洞察力示例GITHUB库 .
请注意,也可以使用SDK以编程方式而不是通过vcperf获取跟踪。见官方 C++构建洞察力SDK 有关详细信息,请参阅文档。
vcperf现在是开源的
vcperf公司 本身是使用C++构建洞察力SDK构建的,而我们是 在GitHub上实现开源 . 我们希望您能够使用它来了解更多关于SDK的信息,并进行自定义 vcperf公司 满足你自己的需要。存储库包括 示例提交 延伸 vcperf公司 检测由于错误条件而重新启动的链接器。该示例突出显示了在WPA中C++的构建见解“构建Explorer视图”中的这些调用。建议按以下顺序阅读此提交示例:
- 重启LinkerDetector.h
- BuildExplorerView.cpp文件
- 命令.cpp
您可能希望构建并运行 vcperf公司 今天从GitHub获得对新事件的访问,这些新事件在发布的版本中还不受支持 vcperf公司 ,包括新模板实例化事件。请注意 vcperf公司 与任何特定版本的Visual Studio无关,但新事件仅在Visual Studio 2019版本16.4及更高版本中受支持。以下是更新的事件表:
告诉我们你的想法!
我们希望你会喜欢这本书的发行 C++构建洞察力SDK ,以及 vcperf公司 . 下载Visual Studio 2019 今天,开始您的第一个C++构建见解应用。
在本文中,我们分享了一个简单的示例,说明如何使用SDK来识别在整个构建中需要花费很长时间才能生成的函数。我们还向您指出了用于定制的有用资源 vcperf公司 . 请继续关注更多的例子和代码样本在未来的博客文章!
是否希望SDK支持其他事件?您有哪些定制方式 vcperf公司 满足你的需要?请让我们知道在下面的评论,在Twitter上 (@VisualC) ),或通过电子邮件 visualcpp@microsoft.com .