使用C ++ Build Insights SDK以编程方式分析您的构建

我们很高兴宣布  C ++ Build Insights SDK的发布,该框架使您可以通过C和C ++ API访问MSVC构建时间信息。除此版本外,我们还在GitHub上发布  vcperf开源由于vcperf本身是使用SDK构建的,因此在开发自己的工具时可以将其用作参考。我们很高兴看到您将使用SDK创建哪些应用程序,我们期待您的反馈!



背景


去年11月,我们推出了vcperf及其Windows性能分析器(WPA)插件,可帮助MSVC用户了解其构建时间。这两个组件都是在C ++ Build Insights的主持下宣布的。但是什么是C ++ Build Insights?

在11月,我们已经说过C ++ Build Insights基于  Windows事件跟踪  (ETW),这是Windows操作系统中提供的一种方便的跟踪机制。但是,ETW不足以将我们的技术扩展到由客户制造的超大型C ++版本。我们需要微调事件模型和使用的分析算法。这项工作的结果是为MSVC提供了一个新的数据分析平台,我们现在将其称为C ++ Build Insights。

今天,vcperf和我们的一些内部工具支持C ++ Build Insights平台。但是,我们希望给大家提供从中受益的机会。为此,我们将其与C和C ++接口组装在一起,以创建完整的软件开发套件。

开始使用C ++ Build Insights SDK


使用C ++ Build Insights SDK创建适合您脚本的自定义工具:

  1. 以编程方式而不是通过WPA分析跟踪。
  2. 将构建时间分析添加到您的持续集成(CI)中。
  3. 或者只是玩一些!


这是您入门SDK的方法。本示例说明了如何创建一个程序,该程序列出了需要花费500毫秒以上的时间才能创建的函数。



  1. 下载并安装Visual Studio 2019的副本 
  2. (trace) .
    1. x64 Native Tools VS 2019.
    2. : vcperf /start MySessionName
    3. C++ , Visual Studio (vcperf ).
    4. : vcperf /stopnoanalyze MySessionName outputFile.etl. (trace) outputFile.etl.

  3. Visual Studio C++.
  4. , « NuGet…» Microsoft.Cpp.BuildInsights NuGet nuget.org. .
  5. .
  6. , outputFile.etl .

#include <iostream>
#include <CppBuildInsights.hpp>
 
using namespace Microsoft::Cpp::BuildInsights;
using namespace Activities;
 
class LongCodeGenFinder : public IAnalyzer
{
public:
    //     ,    
    //    (trace). 
    AnalysisControl OnStopActivity(const EventStack& eventStack) override
    {
        // ,    
        //  TopFunctionsFinder::CheckForTopFunction's.
        //   ,     .
 
        MatchEventStackInMemberFunction(eventStack, this, 
            &LongCodeGenFinder::CheckForLongFunctionCodeGen);
 
        //       
 
        return AnalysisControl::CONTINUE;
    }
 
    //        , 
    //  CodeGeneration,     ,
    //      500 .
 
    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 << "\t Function Name: " << f.Name() << std::endl;
    }
};
 
int main(int argc, char *argv[])
{
    if (argc <= 1) return -1;
 
    LongCodeGenFinder lcgf;
 
    //    ,       (trace).     ; !
    auto group = MakeStaticAnalyzerGroup(&lcgf);
 
    // argv[1]      
    int numberOfPasses = 1;
    return Analyze(argv[1], numberOfPasses, group);
}

在我们的GitHub存储库中,还可以使用C ++ Build Insights示例获得该示例的克隆和嵌入式版本 

请注意,您还可以使用SDK以编程方式而不是通过vcperf获取跟踪。有关更多详细信息,请参见C ++ Build Insights SDK白皮书

vcperf现在是开源


vcperf本身是使用C ++ Build Insights SDK创建的,我们  在GitHub上将其开源我们希望您可以使用它来了解有关SDK的更多信息并根据需要自定义vcperf。该存储库包括  一个示例提交该提交扩展了vcperf以检测由于错误而重新启动的链接器。该示例在WPA的C ++ Build Insights的Build Explorer视图中突出显示了这些调用。我们建议按以下顺序阅读此提交示例:

  1. RestartedLinkerDetector.h
  2. BuildExplorerView.cpp
  3. Commands.cpp

您今天可能要从GitHub构建和运行vcperf的原因是访问vcperf发行版中尚不支持的新事件,包括新模板创建事件。请注意vcperf不受任何特定版本的Visual Studio约束,但是新事件仅在Visual Studio 2019 16.4和更高版本中受支持。这是更新的事件表:



分享您的意见


我们希望您喜欢C ++ Build Insights SDK版本  以及vcperf的开源版本。 立即下载Visual Studio 2019  ,并开始使用第一个C ++ Build Insights应用程序。

All Articles