From cbdce9b669f434b8c4a4c412332d48c01623c568 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 11 Jul 2025 11:03:29 -0700 Subject: [PATCH 01/10] draft --- docs/build-insights/toc.yml | 2 + .../tutorials/build-insights-template-view.md | 173 ++++++++++++++++++ .../media/installer-build-insights.png | Bin 0 -> 6264 bytes .../media/tools-options-build-insights.png | Bin 0 -> 19725 bytes 4 files changed, 175 insertions(+) create mode 100644 docs/build-insights/tutorials/build-insights-template-view.md create mode 100644 docs/build-insights/tutorials/media/installer-build-insights.png create mode 100644 docs/build-insights/tutorials/media/tools-options-build-insights.png diff --git a/docs/build-insights/toc.yml b/docs/build-insights/toc.yml index 99cea23e5b..149a4a7f0f 100644 --- a/docs/build-insights/toc.yml +++ b/docs/build-insights/toc.yml @@ -8,6 +8,8 @@ items: items: - name: "Troubleshoot function inlining on build time" href: ../build-insights/tutorials/build-insights-function-view.md + - name: "Analyze template instantiations to optimize build time" + href: ../build-insights/tutorials/build-insights-template-view.md - name: "Troubleshoot header file impact on build time" href: ../build-insights/tutorials/build-insights-included-files-view.md - name: "Build Insights tips and tricks" diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md new file mode 100644 index 0000000000..d8124a8578 --- /dev/null +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -0,0 +1,173 @@ +--- +title: "Troubleshoot template instantiation impact on build time" +description: "Tutorial for how to use Build Insights template view to analyze and optimize the impact of template instantiations on build time in your C++ projects." +ms.date: 7/9/2025 +helpviewer_keywords: ["C++ Build Insights", "template instantiation analysis", "build time analysis"] +ms.topic: troubleshooting-general +--- +# Troubleshoot template instantiation impact on build time + +Use Build Insights **Templates** view to analyze the impact of template instantiations on build time in your C++ projects. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. + +## Prerequisites + +- Visual Studio 2022 version 17.10 or later. +- The **C++ Build Insights** component must be installed. It's enabled by default if you install either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it is installed by following these steps: + 1. Open the Visual Studio Installer. + 1. Modify your Visual Studio installation. + 1. Under the **Individual components** tab, search for and select **C++ Build Insights**. + :::image type="complex" source="./media/installer-build-insights.png" alt-text="Screenshot of the Visual Studio Installer":::The search box contains C++ build insights. The item C++ Build Insights is visible and selected.":::image-end::: + 1. Click **Modify** to install the component. + +## Overview + +Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which helps diagnose expensive template instantiations during build time. It displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. + +For optimized builds, the time spent on template instantiation contributes significantly to the total build time. In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can become complex enough to noticeably slow down your builds. + +In this article, learn how to use the Build Insights **Templates** view to find template instantiation bottlenecks in your build. + +To try out Build Insights Templates view, follow along to create a project, set the build options, do a build, and analyze the results. + +## Create a test project + +1. Open Visual Studio and create a new **C++ Console App** project and name it `TemplateAnalysis`. +1. Create a header file called `Templates.h`. +1. Replace the contents of the `Templates.h` file with the following code: + + ```cpp + #pragma once + #include + #include + + template struct S1 {}; + template using type = std::vector>; + + template struct S2 {}; + + template struct S3 {}; + + template + struct S3> + { + using type = S2)...>; + }; + + inline size_t LargeValue() + { + return sizeof(S3>); + }; + + inline size_t SmallValue() + { + return sizeof(S1<5>); + } + ``` + +1. Create a source file called `LargeValue.cpp` +1. Replace the contents of the `LargeValue.cpp` file with the following code: + + ```cpp + #include "Templates.h" + + size_t GetLargeValue() + { + return LargeValue(); + } + ``` + +1. Replace the contents of the `TemplateAnalysis.cpp` file with the following code: + + ```cpp + #include "Templates.h" + + extern size_t GetLargeValue(); + + size_t GetSmallValue() + { + return SmallValue(); + } + + int main() + { + size_t largeValue = GetLargeValue(); + size_t smallValue = GetSmallValue(); + return 0; + } + ``` + +1. ## Enable template instantiation data collection + +Template instantiation time collection is off by default to minimize build overhead. To enable it: + +1. In Visual Studio, go to **Tools** > **Options**. +1. In the Options dialog, expand **Build Insights** in the left navigation. +1. Select **Collect Template Instantiation**. +1. You can also choose where to save the report by selecting **Store Build Insights reports in this directory:** and specifying a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. + +:::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantion checkbox is selected."::: + +1. Select **OK**. + +> [!Note] +> Enabling Templates view may increase build time due to the extra data collected. Only enable it when you need to analyze template instantiations. + +## Build the project + +Run Build Insights by choosing from the main menu **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project and not for just the few files may be dirty right now. + +:::image type="content" source="./media/build-insights-rebuild-project.png" alt-text="Screenshot of the main menu with Run Build Insights on Selection > Rebuild selected."::: + +When the build finishes, an Event Trace Log (ETL) file opens.The generated name is based on the collection time. + +## Use Templates View to Optimize Build Time + +The Templates view lists all template instantiations that contributed significantly to build time. Columns include the template name, instantiation time, and the file where the instantiation occurred. + +- **Sort by Instantiation Time** to find the templates that take the longest to instantiate. +- **Expand a template** to see which code triggered the instantiation and how much time each instance took. +- **Filter templates** using the search box to focus on specific types or functions. + +If you see that a particular template instantiation dominates build time, consider: +- Refactoring code to reduce the number of instantiations. +- Moving expensive template code out of headers. +- Using explicit instantiation declarations where possible. + +> **Screenshot suggestion:** Insert a screenshot of the Templates view showing a template instantiation with high build time. **Alt-text:** "Screenshot of the Build Insights Templates view highlighting a template instantiation with high build time." + +## Interpreting Results + +- If the Templates view is empty, your build is likely not dominated by template instantiations. +- The view only shows templates that take a significant amount of time to instantiate, to avoid clutter and reduce data collection overhead. +- Collecting template instantiation data increases build time. Disable the feature when not actively analyzing templates. + +## Improving Build Times + +For more strategies on improving build times in template-heavy code, see: +- [Templates View for Build Insights in Visual Studio](https://devblogs.microsoft.com/cppblog/templates-view-for-build-insights-in-visual-studio-2/) +- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) + +The first article provides an overview of the Templates view and how to use it. The second article dives deeper into template metaprogramming techniques that can reduce build time, with practical examples. + +## Troubleshooting + +- **Templates view does not appear:** Ensure you are using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. Also, make sure Templates view is enabled in the options. +- **No templates listed:** Your project may not have template instantiations that take significant build time, or you may need to build in Release mode with optimizations enabled. +- **Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Disable Templates view when not needed. + +## See also + +- [Build Insights tips and tricks](build-insights-tips.md) +- [Troubleshoot function inlining on build time](build-insights-function-view.md) +- [Build Insights now available in Visual Studio 2022](build-insights-now-available-in-visual-studio-2022.md) +- [Functions View for Build Insights in Visual Studio 2022 17.8](functions-view-for-build-insights-in-visual-studio-2022-17-8.md) +- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) + +--- + +**Summary of additional important points from the blog post:** +- The Templates view helps identify which template instantiations are most expensive, making it easier to target optimizations. +- The feature is especially useful for codebases that use heavy metaprogramming or generic libraries. +- The blog post provides more advanced examples, such as using SFINAE and type traits, which can be referenced for deeper dives but are not included in this basic walkthrough. +- The performance impact of enabling Templates view is non-trivial; only enable it when needed. +- The Templates view is designed to be familiar to users of the Functions view, with similar UI and workflow. diff --git a/docs/build-insights/tutorials/media/installer-build-insights.png b/docs/build-insights/tutorials/media/installer-build-insights.png new file mode 100644 index 0000000000000000000000000000000000000000..55e1ec52cf8170fe287a23517cb2516a3cef86c0 GIT binary patch literal 6264 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 U=H{aVSR%;E{NnklvzKrG7Xq{XIsgCw literal 0 HcmV?d00001 diff --git a/docs/build-insights/tutorials/media/tools-options-build-insights.png b/docs/build-insights/tutorials/media/tools-options-build-insights.png new file mode 100644 index 0000000000000000000000000000000000000000..b0317d247dab92e41760a0ac2b4f5e48552f9d75 GIT binary patch literal 19725 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 literal 0 HcmV?d00001 From d379660708d70d370553938d5ac4403d68aff62f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 11 Jul 2025 17:11:45 -0700 Subject: [PATCH 02/10] draft work --- docs/build-insights/toc.yml | 2 +- .../tutorials/build-insights-template-view.md | 148 +++++++++++++----- .../media/build-insights-rebuild-project.png | Bin 22035 -> 10601 bytes .../media/templates-view-before-fix.png | Bin 0 -> 66563 bytes 4 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 docs/build-insights/tutorials/media/templates-view-before-fix.png diff --git a/docs/build-insights/toc.yml b/docs/build-insights/toc.yml index 149a4a7f0f..5641215a9c 100644 --- a/docs/build-insights/toc.yml +++ b/docs/build-insights/toc.yml @@ -8,7 +8,7 @@ items: items: - name: "Troubleshoot function inlining on build time" href: ../build-insights/tutorials/build-insights-function-view.md - - name: "Analyze template instantiations to optimize build time" + - name: "Troubleshoot template instantiation impact on build time" href: ../build-insights/tutorials/build-insights-template-view.md - name: "Troubleshoot header file impact on build time" href: ../build-insights/tutorials/build-insights-included-files-view.md diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index d8124a8578..1c46be7da1 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -7,15 +7,17 @@ ms.topic: troubleshooting-general --- # Troubleshoot template instantiation impact on build time -Use Build Insights **Templates** view to analyze the impact of template instantiations on build time in your C++ projects. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. +Use Build Insights **Templates** view to analyze the impact of template instantiations on C++ build time. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. + +Templates view is designed to be familiar to users of the [Functions view](build-insights-function-view.md), with similar UI and workflow. ## Prerequisites - Visual Studio 2022 version 17.10 or later. -- The **C++ Build Insights** component must be installed. It's enabled by default if you install either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it is installed by following these steps: +- The **C++ Build Insights** component must be installed. It's installed as part of either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it is installed by following these steps: 1. Open the Visual Studio Installer. - 1. Modify your Visual Studio installation. - 1. Under the **Individual components** tab, search for and select **C++ Build Insights**. + 1. Choose to modify your Visual Studio installation. + 1. Under the **Individual components** tab, search for and then select **C++ Build Insights**. :::image type="complex" source="./media/installer-build-insights.png" alt-text="Screenshot of the Visual Studio Installer":::The search box contains C++ build insights. The item C++ Build Insights is visible and selected.":::image-end::: 1. Click **Modify** to install the component. @@ -23,17 +25,16 @@ Use Build Insights **Templates** view to analyze the impact of template instanti Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which helps diagnose expensive template instantiations during build time. It displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. -For optimized builds, the time spent on template instantiation contributes significantly to the total build time. In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can become complex enough to noticeably slow down your builds. +For optimized builds, the time spent on template instantiation contributes significantly to the total build time. In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can noticeably slow down your builds. In this article, learn how to use the Build Insights **Templates** view to find template instantiation bottlenecks in your build. -To try out Build Insights Templates view, follow along to create a project, set the build options, do a build, and analyze the results. +Follow along to create a project that demonstrates template instantiation, run Build Insights to gather template instantiation times, and analyze the results. -## Create a test project +## Create a template test project 1. Open Visual Studio and create a new **C++ Console App** project and name it `TemplateAnalysis`. -1. Create a header file called `Templates.h`. -1. Replace the contents of the `Templates.h` file with the following code: +1. Create a header file called `Templates.h` and replace its contents with the following code: ```cpp #pragma once @@ -64,8 +65,7 @@ To try out Build Insights Templates view, follow along to create a project, set } ``` -1. Create a source file called `LargeValue.cpp` -1. Replace the contents of the `LargeValue.cpp` file with the following code: +1. Create a source file called `LargeValue.cpp` and replace its contents with the following code: ```cpp #include "Templates.h" @@ -96,52 +96,127 @@ To try out Build Insights Templates view, follow along to create a project, set } ``` -1. ## Enable template instantiation data collection +## Enable build time data collection Template instantiation time collection is off by default to minimize build overhead. To enable it: 1. In Visual Studio, go to **Tools** > **Options**. -1. In the Options dialog, expand **Build Insights** in the left navigation. +1. In the **Options** dialog, expand **Build Insights** in the left navigation. 1. Select **Collect Template Instantiation**. -1. You can also choose where to save the report by selecting **Store Build Insights reports in this directory:** and specifying a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. +1. You can also choose where to save the report by selecting **Store Build Insights reports in this directory** and specifying a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. +1. Select **OK**. :::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantion checkbox is selected."::: -1. Select **OK**. - > [!Note] -> Enabling Templates view may increase build time due to the extra data collected. Only enable it when you need to analyze template instantiations. +> Collecting template instantiation times may increase build time due to the extra data collected. Only enable it when you want to analyze template instantiation bottlenecks. -## Build the project +## Run Build Insights to get template instantiation times -Run Build Insights by choosing from the main menu **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project and not for just the few files may be dirty right now. +From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. :::image type="content" source="./media/build-insights-rebuild-project.png" alt-text="Screenshot of the main menu with Run Build Insights on Selection > Rebuild selected."::: When the build finishes, an Event Trace Log (ETL) file opens.The generated name is based on the collection time. -## Use Templates View to Optimize Build Time +## Use Templates view to optimize build time + +The **Templates** view lists the template instantiations that contributed significantly to build time. Columns provide information about: + +The **Time [sec, %]** column shows how long it took to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. + +The **Specialization Name** column shows the specific template instantiation, including the template arguments that were used. This helps you identify which template specializations are most expensive. + +The **Translation Unit** column shows which source file caused this template instantiation. Multiple files can cause the same template instantiation if they include the same header with the template definition. + +The **Instantiation File Path** column shows where in your source code the template instantiation happens. This helps you locate the exact line of code responsible for the expensive instantiation. + +The view only shows instantiations whose contribution exceeds a certain threshold. If you don't see anything in the **Templates** view, it means the build time isn't dominated by template instantiations. + +:::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: +The Templates view shows two template instantiations of struct S3 taking most (79.4480%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. +:::image-end::: + +- Sort by **Time** to find the templates that take the longest to instantiate. +- Expand a template to see its various instantiations and where they happened. +- Use the search box to focus on specific templates. + +## Improve build time by optimizing template instantiations + +In our example, we can see that two template instantiations of `S3` are taking 83% of the entire build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. + +Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we can derive that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to our build. + +From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which corresponds to this code in `Templates.h`: + +```cpp +inline size_t LargeValue() +{ + + return sizeof(S3>); +}; +``` + +There are three main ways to decrease the cost of template instantiations: + +### Remove unused templates + +Review the template in question and determine if it's being used. If it's not being used, the easiest solution is to remove the function or template. In our example, `LargeValue()` is being used by `LargeValue.cpp`, so we cannot remove it. + +You can also consider removing include directives that bring in unnecessary template instantiations. It's easy to forget to remove header files when you're no longer using them, and unused includes can cause significant impact on build time. + +### Optimize the template implementation + +Look at the template instantiation and determine if there is a way to optimize the code. Some optimization techniques include: + +- Reducing the complexity of template metaprogramming +- Using simpler template patterns +- Avoiding recursive template instantiation patterns that lead to exponential growth +- Using `if constexpr` instead of SFINAE where possible + +For more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/), which provides detailed examples of reducing template instantiation overhead. + +### Move template instantiations to source files -The Templates view lists all template instantiations that contributed significantly to build time. Columns include the template name, instantiation time, and the file where the instantiation occurred. +For our purposes, let's assume that we need the template instantiation as-is. We can rely on the third approach: moving the definition that causes the expensive template instantiation to a source file. -- **Sort by Instantiation Time** to find the templates that take the longest to instantiate. -- **Expand a template** to see which code triggered the instantiation and how much time each instance took. -- **Filter templates** using the search box to focus on specific types or functions. +Since `LargeValue.cpp` is the only source file that calls `LargeValue()`, we can move the definition to `LargeValue.cpp`. This prevents the template instantiation from happening in every translation unit that includes `Templates.h`. -If you see that a particular template instantiation dominates build time, consider: -- Refactoring code to reduce the number of instantiations. -- Moving expensive template code out of headers. -- Using explicit instantiation declarations where possible. +To do this, remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: -> **Screenshot suggestion:** Insert a screenshot of the Templates view showing a template instantiation with high build time. **Alt-text:** "Screenshot of the Build Insights Templates view highlighting a template instantiation with high build time." +```cpp +size_t LargeValue(); +``` -## Interpreting Results +Then, inside `LargeValue.cpp` add the definition: -- If the Templates view is empty, your build is likely not dominated by template instantiations. -- The view only shows templates that take a significant amount of time to instantiate, to avoid clutter and reduce data collection overhead. -- Collecting template instantiation data increases build time. Disable the feature when not actively analyzing templates. +```cpp +size_t LargeValue() +{ + return sizeof(S3>); +} +``` -## Improving Build Times +Now, when you rebuild the project and run Build Insights again, you should see that the expensive template instantiation is no longer listed in the **Templates** view. The build time should also decrease significantly. + +:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization showing reduced template instantiation time."::: + +The Templates view now shows only one instantiation of S3 instead of two, and the total build time has been significantly reduced. + +:::image-end::: + +The build time has significantly decreased. While the template instantiation of `S3` is still contributing to the build time, we've been able to roughly halve the total time by only including necessary template instantiations. You can see the count of `S3` instantiations is now 1 instead of 2. + +This technique scales well to larger projects. If multiple files included `Templates.h`, each of those files would have added the instantiation time of `LargeValue()` to the total build time. By moving the definition of `LargeValue()` to a dedicated source file, we minimize our build time. + +## Understanding Templates view results + +When interpreting Templates view results, keep these points in mind: + +- **Empty view**: If nothing shows up in the Templates view, it means your build time is not dominated by template instantiations. This is actually good news - your templates are not a build bottleneck. +- **Duplicate instantiations**: The same template instantiation appearing multiple times with different translation units indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. +- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. +- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations it may trigger. For more strategies on improving build times in template-heavy code, see: - [Templates View for Build Insights in Visual Studio](https://devblogs.microsoft.com/cppblog/templates-view-for-build-insights-in-visual-studio-2/) @@ -166,8 +241,5 @@ The first article provides an overview of the Templates view and how to use it. --- **Summary of additional important points from the blog post:** -- The Templates view helps identify which template instantiations are most expensive, making it easier to target optimizations. -- The feature is especially useful for codebases that use heavy metaprogramming or generic libraries. - The blog post provides more advanced examples, such as using SFINAE and type traits, which can be referenced for deeper dives but are not included in this basic walkthrough. -- The performance impact of enabling Templates view is non-trivial; only enable it when needed. -- The Templates view is designed to be familiar to users of the Functions view, with similar UI and workflow. + diff --git a/docs/build-insights/tutorials/media/build-insights-rebuild-project.png b/docs/build-insights/tutorials/media/build-insights-rebuild-project.png index 63ceed7705e216cfb8e210fd762c7050fce28e2c..fcd96f050e79b8a1bdcf3bf251ef50f84ecd4243 100644 GIT binary patch literal 10601 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%0A=g^ABe%Nzze8% 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 SI`*{(>1S37 zSc7R{Ui2Fk1zFf5M7ljO^0AKJ_{GuyKI}F*Sk(P?qwpW6!!st=A}YG|gv)GAJ3B(g z>7~JMKE6KOeeFw=D3bJ#_V0?rGEq>|U%fhOCt7^G ztYXy;vF};{<_+X8V@f;X_Ri!%Xp6vnz5UoK*L=XnYcxm0D%cHkEwGEn=6ey+RH7BC z@xcM&P1LPLgl-K@)F|^uwPAr#ZD@OGHlA_Z$8MZ})I`Udb5oZ4*y$cyU6DZlQdH4T ztPkZlB)vWd*{nR@)$t{HK1L-xx+~gX0ft!|W0vb~p}v_@iLeo?mj(w z7(0@2r8%XW+R(hfp=9B@&=BeS;ghzzhmw2maprC?n!-yCArh?8?PaWk zuuj2n2@o#pc5bU_WP%a3hCdD#Lk&hAA|=R;_#9ELD@1NshHtwy+287a&(V5a)5(-(p<=iy}nrhdG9oFy>qP+xv8PS0;|JMaDiXG zU}~e#BZ{7hB=_^n_7HAXaRBgRLWOctdA^yDV09rviU3TkL5`zDZ zM|{}_^uS;^`=)nlgt=XL?Ae99mQ&utvj)Jqxb+jn&#o!dcw2wh97^ZS4BlDa5I>hp zyuLQnjeRoZlr0e+&aO=0cFypK`WOq)i1djE7jV>}rxcgh>^ESEs2n1OtTgbaL^#t- z!I|x+8_2HJ)zu<82Nwh4ipK-M0{#*T7zb0uAI{e1|5%kdxA_{)GyScJVEu|)+@K9i zAo&0|X1ew0C=bsu4(_(5U#_qI&jiw>i7DdHbru#C2S&dUbSG-qQNI7%^HMIF#c_w{ znOK0;PXSlYWdi;JA{jl?%%;Gnst9tLOddmY;uYTNg(=u~nd_{=6ADnHPnEg&se&Un zPR;sM`76;#T~I16t^gGFpE8qb6LdR&*A|xzn}wZnx*MD96U^|o}khaEkTv~og4CY8cyoDo#ZwMFaEzZ{??y*%ugaI!PAlJjK}h(s8~a*>=pyxYcNK(M8@AkG52j z=Xyi9LXX$Oh3a;y!xT&e>c+zE85jnxUbs9@TnA{S8anclqc~BOWAB6z_(n)D0Fd81 z;oxn#>#g$RXs?v@{Mw6;VTs>mK*6(UrG)x<+}HT&N%v!GldvbyOqfzJSy2-12m7hq zIx(0+!;gOhLU{1)75)98f+%4?hc`i93-+yFyV?9Fi18Qs{Z~fuXA2xSa|D>wjp%4k zM#&EI2M{knx$Z`uSiuLnW5>C(v9x7>lvA;aY*%_hJg`_-fD~i_nf_ac8o{C}e&fxZ z0f+4*(q*(&bO#h z9Xp=V*KfyCgs+J0YxwruQ zp=6IWn{S4DPhJD1x{|xiuJ`+la-`YEXJ1q*Wx*`@9)i9w%enlI834Oi$*b)t^@0}? zY~NnQ$hQ_WVGobX>t8dVn20IMrEjGtAY9S>N!nWCXFy5H)3*F{Vm-f+>ZB&ZPmCTD z;^^(ZE?cwd;r2ut!h0UJA7{TH1c|irxw)q)$#>yUciMNW*AN9lVpo_v`1oKi; zj#$MG+ou8{dZ@Iwu7j_ettM`&zm-!(Dv2m6`7otRRJS^%CR>tru=_ z`Yd)j{#8a;IZ*31OYkm={-FH$uzOLERXpP#lX#2wNCLVq-;({KDJmu4NLx|b3d81D z4@f4P_fMvpK;GenBmEF^{_|@DwE%Hwjh#7|+;%Ba824GUZusTl`B(wC3Ad8y$$-%L^&srf4Ih)E8fWo~1=ZSFMg zhBmw9dA}+#@8omDps zmUX8%Xh^D)z<0k*UCvOH@V>cczis~#9`$DM+)pCeoiCi8_DV$9fy+vr{wWZpmn?Me z&USq7>4d#ZT^+l%mnbr3!`jMPHC>=gojd=JVqrP|nNwEHnyl|D?~>zO`u@QjPghFZ zP|>O`{g`i-vs4R)r^vxA5=_#1+##X7JDhvP1bcfF#IhRWLN2L6iA4>tdSKD`*@^1c q*hMGif_6&q5fRp7$&j_(y-oE)SIO_>(?BEFJ-->6!AlGr!u|z2&IgMC diff --git a/docs/build-insights/tutorials/media/templates-view-before-fix.png b/docs/build-insights/tutorials/media/templates-view-before-fix.png new file mode 100644 index 0000000000000000000000000000000000000000..5c52be969024c2a7510a1846efa2157f038a8717 GIT binary patch literal 66563 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 Date: Mon, 14 Jul 2025 14:34:13 -0700 Subject: [PATCH 03/10] draft --- .../tutorials/build-insights-template-view.md | 101 +++++++++--------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index 1c46be7da1..cdd12cc4eb 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -9,7 +9,7 @@ ms.topic: troubleshooting-general Use Build Insights **Templates** view to analyze the impact of template instantiations on C++ build time. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. -Templates view is designed to be familiar to users of the [Functions view](build-insights-function-view.md), with similar UI and workflow. +Templates view will seem familiar to users of Build Insight's [Functions view](build-insights-function-view.md) due to similar UI and workflow. ## Prerequisites @@ -23,13 +23,11 @@ Templates view is designed to be familiar to users of the [Functions view](build ## Overview -Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which helps diagnose expensive template instantiations during build time. It displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. +Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. -For optimized builds, the time spent on template instantiation contributes significantly to the total build time. In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can noticeably slow down your builds. +In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can noticeably slow down your builds. -In this article, learn how to use the Build Insights **Templates** view to find template instantiation bottlenecks in your build. - -Follow along to create a project that demonstrates template instantiation, run Build Insights to gather template instantiation times, and analyze the results. +In this article, follow along to create a project that demonstrates template instantiation impact on build time, run Build Insights to gather template instantiation times, and analyze the results. ## Create a template test project @@ -109,9 +107,9 @@ Template instantiation time collection is off by default to minimize build overh :::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantion checkbox is selected."::: > [!Note] -> Collecting template instantiation times may increase build time due to the extra data collected. Only enable it when you want to analyze template instantiation bottlenecks. +> Collecting template instantiation times increases build time due to the extra data collected. Only enable it when you want to analyze template instantiation bottlenecks. -## Run Build Insights to get template instantiation times +## Run Build Insights to get template instantiation data From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. @@ -119,19 +117,23 @@ From the main menu, select **Build** > **Run Build Insights on Selection** > **R When the build finishes, an Event Trace Log (ETL) file opens.The generated name is based on the collection time. -## Use Templates view to optimize build time - -The **Templates** view lists the template instantiations that contributed significantly to build time. Columns provide information about: +## Understanding Templates view results -The **Time [sec, %]** column shows how long it took to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. +When interpreting Templates view results, keep these points in mind: -The **Specialization Name** column shows the specific template instantiation, including the template arguments that were used. This helps you identify which template specializations are most expensive. +- **Empty view**: If nothing shows up in the Templates view, it means your build time isn't dominated by template instantiations. This is good news because your templates are not a build bottleneck. +- **Duplicate instantiations**: The same template instantiation appearing multiple times with different translation units indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. +- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. +- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations it triggers. -The **Translation Unit** column shows which source file caused this template instantiation. Multiple files can cause the same template instantiation if they include the same header with the template definition. +## Use Templates view to optimize build time -The **Instantiation File Path** column shows where in your source code the template instantiation happens. This helps you locate the exact line of code responsible for the expensive instantiation. +The **Templates** view lists the template instantiations that contributed significantly to build time. Columns provide information about: -The view only shows instantiations whose contribution exceeds a certain threshold. If you don't see anything in the **Templates** view, it means the build time isn't dominated by template instantiations. +- **Time [sec, %]** shows how long it took to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. +- **Specialization Name** shows each template instantiation, including the template arguments that were used. This helps you identify which template specializations are most expensive. +- **Translation Unit** shows which source file each template instantiation happened in. Multiple files can cause the same template instantiation if they include the same header with the template definition. +- **Instantiation File Path** shows where in your source code the template instantiation happens. This helps you locate the exact line of code responsible for the expensive instantiation. :::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: The Templates view shows two template instantiations of struct S3 taking most (79.4480%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. @@ -143,16 +145,15 @@ The Templates view shows two template instantiations of struct S3 taking most (7 ## Improve build time by optimizing template instantiations -In our example, we can see that two template instantiations of `S3` are taking 83% of the entire build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. +In the example, we can see that two template instantiations of `S3` are taking 83% of the entire build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. -Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we can derive that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to our build. +Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we can infer that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to our build. From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which corresponds to this code in `Templates.h`: ```cpp inline size_t LargeValue() { - return sizeof(S3>); }; ``` @@ -161,21 +162,10 @@ There are three main ways to decrease the cost of template instantiations: ### Remove unused templates -Review the template in question and determine if it's being used. If it's not being used, the easiest solution is to remove the function or template. In our example, `LargeValue()` is being used by `LargeValue.cpp`, so we cannot remove it. +Review the template in question and determine if it's being used. If it's not being used, the easiest solution is to remove the function or template. In the example, `LargeValue()` is being used by `LargeValue.cpp`, so we can't remove it. You can also consider removing include directives that bring in unnecessary template instantiations. It's easy to forget to remove header files when you're no longer using them, and unused includes can cause significant impact on build time. -### Optimize the template implementation - -Look at the template instantiation and determine if there is a way to optimize the code. Some optimization techniques include: - -- Reducing the complexity of template metaprogramming -- Using simpler template patterns -- Avoiding recursive template instantiation patterns that lead to exponential growth -- Using `if constexpr` instead of SFINAE where possible - -For more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/), which provides detailed examples of reducing template instantiation overhead. - ### Move template instantiations to source files For our purposes, let's assume that we need the template instantiation as-is. We can rely on the third approach: moving the definition that causes the expensive template instantiation to a source file. @@ -209,37 +199,42 @@ The build time has significantly decreased. While the template instantiation of This technique scales well to larger projects. If multiple files included `Templates.h`, each of those files would have added the instantiation time of `LargeValue()` to the total build time. By moving the definition of `LargeValue()` to a dedicated source file, we minimize our build time. -## Understanding Templates view results +### Optimize the template implementation -When interpreting Templates view results, keep these points in mind: +Look at the template instantiation and determine if there's a way to optimize the code. Some optimization techniques include: -- **Empty view**: If nothing shows up in the Templates view, it means your build time is not dominated by template instantiations. This is actually good news - your templates are not a build bottleneck. -- **Duplicate instantiations**: The same template instantiation appearing multiple times with different translation units indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. -- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. -- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations it may trigger. +- Using simpler template patterns +- Reducing the complexity of template metaprogramming +- Avoiding recursive template instantiation patterns that lead to exponential growth +- Use `if constexpr` instead of SFINAE where possible + +For more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/), which provides detailed examples of reducing template instantiation overhead. -For more strategies on improving build times in template-heavy code, see: -- [Templates View for Build Insights in Visual Studio](https://devblogs.microsoft.com/cppblog/templates-view-for-build-insights-in-visual-studio-2/) -- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) +## Tips -The first article provides an overview of the Templates view and how to use it. The second article dives deeper into template metaprogramming techniques that can reduce build time, with practical examples. +- You can **File** > **Save As** the ETL file to a more permanent location to keep a record of the build time. You can then compare it to future builds to see if your changes are improving build time. +- If you inadvertently close the Build Insights window, reopen it by finding the `.etl` file in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. +- To dig into the Build Insights data with Windows Performance Analyzer (WPA), click the **Open in WPA** button in the bottom right of the ETL window. +- Drag columns to change the order of the columns. For instance, you may prefer moving the **Time** column to be the first column. You can hide columns by right-clicking on the column header and deselecting the columns you don't want to see. +- The **Templates** view provides a filter box to find a specific template instantiation. It does partial matches on the name you provide. +- If you forget how to interpret what the **Templates** view is trying to show you, hover over the tab to see a tooltip that describes the view. ## Troubleshooting -- **Templates view does not appear:** Ensure you are using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. Also, make sure Templates view is enabled in the options. -- **No templates listed:** Your project may not have template instantiations that take significant build time, or you may need to build in Release mode with optimizations enabled. -- **Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Disable Templates view when not needed. +**Templates view is empty**: This could mean: + +- Template data collection is not enabled (check your options settings). +- Your build time is not dominated by template instantiations. +- Do a rebuild instead of a build. The Build Insights window doesn't appear if nothing builds, which may be the case if no files changed since the last build. +- Ensure you are using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. + +**Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Disable **Templates** view when not needed. ## See also - [Build Insights tips and tricks](build-insights-tips.md) +- [#include cleanup in Visual Studio](https://devblogs.microsoft.com/cppblog/include-cleanup-in-visual-studio/) +- [Troubleshoot header file impact on build time](build-insights-included-files-view.md) - [Troubleshoot function inlining on build time](build-insights-function-view.md) -- [Build Insights now available in Visual Studio 2022](build-insights-now-available-in-visual-studio-2022.md) -- [Functions View for Build Insights in Visual Studio 2022 17.8](functions-view-for-build-insights-in-visual-studio-2022-17-8.md) -- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) - ---- - -**Summary of additional important points from the blog post:** -- The blog post provides more advanced examples, such as using SFINAE and type traits, which can be referenced for deeper dives but are not included in this basic walkthrough. - +- [Build Insights now available in Visual Studio 2022](https://devblogs.microsoft.com/cppblog/build-insights-now-available-in-visual-studio-2022) +- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) \ No newline at end of file From fa6e3fe2860158ec666e730e0f8bb18681f34e14 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 14 Jul 2025 15:11:10 -0700 Subject: [PATCH 04/10] draft --- .../tutorials/build-insights-template-view.md | 30 +++++++----------- .../media/templates-view-after-fix.png | Bin 0 -> 26143 bytes .../media/templates-view-before-fix.png | Bin 66563 -> 66831 bytes 3 files changed, 12 insertions(+), 18 deletions(-) create mode 100644 docs/build-insights/tutorials/media/templates-view-after-fix.png diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index cdd12cc4eb..fdba6806a9 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -136,7 +136,7 @@ The **Templates** view lists the template instantiations that contributed signif - **Instantiation File Path** shows where in your source code the template instantiation happens. This helps you locate the exact line of code responsible for the expensive instantiation. :::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: -The Templates view shows two template instantiations of struct S3 taking most (79.4480%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. +The Templates view shows two template instantiations of struct S3 taking most (79.448%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. The build time is 4.066 seconds. :::image-end::: - Sort by **Time** to find the templates that take the longest to instantiate. @@ -145,9 +145,9 @@ The Templates view shows two template instantiations of struct S3 taking most (7 ## Improve build time by optimizing template instantiations -In the example, we can see that two template instantiations of `S3` are taking 83% of the entire build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. +In the example, we can see that two template instantiations of `S3` are taking 79% of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. -Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we can infer that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to our build. +Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we infer that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to the build. From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which corresponds to this code in `Templates.h`: @@ -170,15 +170,13 @@ You can also consider removing include directives that bring in unnecessary temp For our purposes, let's assume that we need the template instantiation as-is. We can rely on the third approach: moving the definition that causes the expensive template instantiation to a source file. -Since `LargeValue.cpp` is the only source file that calls `LargeValue()`, we can move the definition to `LargeValue.cpp`. This prevents the template instantiation from happening in every translation unit that includes `Templates.h`. - -To do this, remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: +Since `LargeValue.cpp` is the only source file that calls `LargeValue()`, we can move the definition to `LargeValue.cpp`. This prevents the template instantiation from happening in every translation unit that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: ```cpp size_t LargeValue(); ``` -Then, inside `LargeValue.cpp` add the definition: +Inside `LargeValue.cpp` add the definition: ```cpp size_t LargeValue() @@ -187,16 +185,14 @@ size_t LargeValue() } ``` -Now, when you rebuild the project and run Build Insights again, you should see that the expensive template instantiation is no longer listed in the **Templates** view. The build time should also decrease significantly. - -:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization showing reduced template instantiation time."::: +Rebuild the project and run Build Insights again. From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. -The Templates view now shows only one instantiation of S3 instead of two, and the total build time has been significantly reduced. +The build time has significantly decreased. While the template instantiation of `S3` is still contributing to the build time, we've been able to roughly halve the total time by only including necessary template instantiations. You can see the count of `S3` instantiations is now 1 instead of 2. +:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization showing reduced template instantiation time."::: +The Templates view now shows only one instantiation of S3 instead of two, and the total build time is significantly less at 3.152 seconds. :::image-end::: -The build time has significantly decreased. While the template instantiation of `S3` is still contributing to the build time, we've been able to roughly halve the total time by only including necessary template instantiations. You can see the count of `S3` instantiations is now 1 instead of 2. - This technique scales well to larger projects. If multiple files included `Templates.h`, each of those files would have added the instantiation time of `LargeValue()` to the total build time. By moving the definition of `LargeValue()` to a dedicated source file, we minimize our build time. ### Optimize the template implementation @@ -212,12 +208,10 @@ For more advanced template optimization techniques, see [Build Throughput Series ## Tips -- You can **File** > **Save As** the ETL file to a more permanent location to keep a record of the build time. You can then compare it to future builds to see if your changes are improving build time. -- If you inadvertently close the Build Insights window, reopen it by finding the `.etl` file in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. -- To dig into the Build Insights data with Windows Performance Analyzer (WPA), click the **Open in WPA** button in the bottom right of the ETL window. -- Drag columns to change the order of the columns. For instance, you may prefer moving the **Time** column to be the first column. You can hide columns by right-clicking on the column header and deselecting the columns you don't want to see. +- You can use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time. You can then compare it to future builds to see if your changes are improving build time. +- If you inadvertently close the Build Insights window, reopen it by finding the `.etl` file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. +- Drag columns to change the order of the columns. For instance, you may prefer moving the **Wall Time Responsibility** column to be the first column. You can add or hide columns by right-clicking on the column header and selecting or deselecting the columns you don't want to add or hide. - The **Templates** view provides a filter box to find a specific template instantiation. It does partial matches on the name you provide. -- If you forget how to interpret what the **Templates** view is trying to show you, hover over the tab to see a tooltip that describes the view. ## Troubleshooting diff --git a/docs/build-insights/tutorials/media/templates-view-after-fix.png b/docs/build-insights/tutorials/media/templates-view-after-fix.png new file mode 100644 index 0000000000000000000000000000000000000000..7acc1cf276c034591d4b1130bb4f0abe29ec9013 GIT binary patch literal 26143 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 y7XZHx9oCa%DCeNxuK@!+5EJGs=1o+DU literal 0 HcmV?d00001 diff --git a/docs/build-insights/tutorials/media/templates-view-before-fix.png b/docs/build-insights/tutorials/media/templates-view-before-fix.png index 5c52be969024c2a7510a1846efa2157f038a8717..22bd3ba5fd4e642d3ac87506d5ede96a7cd12214 100644 GIT binary patch literal 66831 zcmb5VXIN8R(=ZAuD1smY0@6h3y+{|3qI8hnL3#}cA@rhv0-~UX-aK!BWhKYG9K^PTHD=lXs?_9}bUteIIevu9>Sz0_2?bNj(t@mj&o(Mj3g(@xi4Q_sfV#YV!GT~_AK?WewyI0yhcFRO>X09QAl zq_6a&e*jD3o_}}qKazRsX=^X3qxj;_3|ve4k)xN_Ye{~7A0Hn+A7MUsPX~TM2?+^) z0U>@NAzs`JUZ9_wmz6KC8}RWT0E%`%8&9X#UQX_A4}Sx+vUUe~Nk0OCoNOiSt?Wgt zZEZz(t*wM@c?AV+t$3|$g#~$Sg@tX!L;EW{QFr_%hSmYhsEzDWdxu8GyY$FPx*f%^1l$1`A-jSuehgwDf635|5De^4M$QR z9PN1Gl8AAvyr-flr{`<2Gv{L#=g@eH9VSWGnchRE?ePbA8W6};{CXn|qUbDBrl10A zh`!K8c3sP6Yf1$~QL62vMAB$jTStv{yuZzonl$wmeL329O2IA6VJsUmnKa^{EJu;Lv9xG9mg8OvU9#tHJWKZ-Wo^X1-n5 z>yh|_aO4Xm92WKM<5Wov$E(!8p$#$xkNbT|x7GjiYDbG!sGj_+Ra%%H+VfQr-+5;I zjlYO5&9nao+xEca&0lO4mmmN4M$BzKJM#n8fm7Sf^=&Aj?kAxWtV8|VKwiuQbl74o zNj=Fcmb_Rk(^lm14gwC{`{eDDHrxWFA5LudYszzO@D@vLZ}GsaT$SF8m7bYf74#1( zJjxfF3cf;3377B#E%^RY(X7>lL}!lsTI7&`jc9S~Apd#jUbL&I``UBMb-?olF~GVr zZM)aH+Yvy**sW~t&N^jBlfv$&jF6`t>z4FuNBsBieTY(FV!}Ojxhf?PWO&%8O zd070*nDN3dH~(%P$B&NmUxYUbYh1w-KxfVtE~}Hsl&TU5J`unWtApmSnt||-`LaBF zu>ufVP=lE{X1w3;siYgGc<;1qlEGJII}au3Fcg_`>FiPrT@_O_?+&hA2jOT%aTUwYoBb(b7F>+Z1{tmcB%D}{_RLLhY;#<5Q-_#AeZ8!4CAgvZH-e?)3z zYVOTLs%Q971%yR;hW+ogKcB|%y`hkQq5QsuXL}GfgqgJC2g=_&u*~00RVIXpm-IjE zFgUCwNhskfbYOBY!ONDz4>LJOU`V5``pXVZoq_D>!|%B=zX2ZEAEh3b)|SpBSVk8& zc#9eWEii}qu#%BgMX3xm;EN~EDUR{0OwJoQ(b0oAmadQzI@I*e`z%r0;uIimPAbUdz=ul1wWSHvqK82FTImsU(sq|r_1ZaL?TH^$0N)# zSQ~c|-0roIuf7uk5Q@I&OP#nh5gtI@n~>nFn3LERlA%H3KU{URb$j`l>&-@DtrjBa zrqIVnJgm=D?$Z*qCwY~EPveX@Zbx=a*6c-tY4R-#$n?}t!$WoRKzqwSJS=h~uM^gu z!1H(y=7ZfzEPDuzOxO@lScmS(2sz8{%bXGL0()SPT%9)aIey#$Ka z9)omusWpr_*>TKK;dSAZe3yOC)T_56xAjxk%}hgCc|pO7M9~QS^5AeCb*F|><~gWL zj-N!y=dYe($(j-&Yd*2w>y=6cUw7?AzS&5=OEAv+R9KNq(tNqE1?fvVVReSa|9i&w z2nh<^60LZ~LMiR5n_Ls=1~o!p{8iJgY+p8tdo~($8zf*Z2BxO9yzVS+=a={7vJ=ve z&!{8LE@E5K#p+e_;_gfFkM-ToVO~6H54`GRS3kVztnvQC!vkQqAZ_3a@Wq+cRp0hg zKAbZ6qqN-oKljx!G2=tVbw?-OL-89);#!)VReuIv?(-|JFd)MMd$(9)wqK8Vn`6vk zXU@k?VfD!$H}F32?7|oB)-4BGM9<6=0nYB|c2~mlSv;XLxCEg_&~!Au1;L)O%)0{Tp0Yk} zK}5ewwGCgX_Fewb#7pz*cXOR54ujWEP6(DfM4V^IO>h*cW!${{p$i>?YNVGm7gLym=H{oSc;Zk-SK$ zMBD#`ek4K@XT1J3q)X7>XnP&62J1ZVcK__c^#_{I&EKH@omQ9rf2{l87EMGzS-q<&6qQwURjF$4y6wT z0NhfBqBdqi1<;Yq(X~g_Nu<&2Vh_KKgIgOV;BfXts%W(|>LShZW%S59)b`WX_G|fw zFsI*}JoBnqxbA*f4_&Jk^RM`3UUWHwtxc4JfBPdBw>(_TpMUPtE_SG^u=8Y&eh_Eu zS;w8VKYlkfU^*k}(rgN!q)V%+a+(8vBVFzIQ!=nyxa>R=pcvK!e4>8qtDJv~bwp$k#H z(dO6f3*eO-9Z%L4;(q-PLMLSs$^<`)&;oN2iz%K(IM!^d<{lf1o>#Rk237>ew2)}c z$=2DoDD-~SZOAI~8qO*g^Q_&0oW*6N48Ja=9Bdd@vs}vO^Ko6M4J>7EQ-BK3<$Y9L zhK~1{r|u>cE?1%p`OASc(FUUV+x;-Ug0-iTT(}*3=S$JMAcuCa;iOO=E*x_N!(;43 z*5Syjf@)hvVKBv*{t9+AHC+Vx+85jow=@2YR(x)O2D~gTsS9=E!xkqJj_$ zr6|Z%TJsnE>RC?AaN8zGeVC@Jetw8s&!O*jI&~YTaNe^`mB?3x+Xo3L%r^`+hU=On z8`C5%G<|lFhB#LRC%eZsWq_^z+e`uW3{*3R!rMxY@Rz3LrZ*cd&IA#`z^Mow-L1r< z2d&j7%N4PIcp2F=0U{`L9^0Dc6|sBU=vq8Hf6GQYB4w0Q2r9K>*yt2ho z;1&DFxX(2yU!SnKw0$x&;Mwg7G?kd4lg>Kf5Oqz_Oofh3A9h+@IS&Wxq#MhoZBBJ% z#!s*EOnmAGG1XLw*LI9>R(uhT=thN))4TVuI~T?`iO%tkNwvf*C)tXRNTJK zj7WCd=JvQHl?cB#Ua{S430Pl??({OEUt_~_$jRtWaTOH#Uc0g4HFqVF=Z1Qw#WPSB zk1zS{SJx+sBX-h7cEr)^;ynDvlL*vb=c1 z`V(US+dZ#6wcB7MUN%2#1V`+fc=z?CO!omYU>Bk9eYaggY0j5H@cbq_|2+HG9D`fE z^}U~~7ND1R*ASsxE%G$EcKtuM2MKSO`U|;LA=4VafZL*aDbiIj$MF8j@j=GOk71i` zY_>PGX1qA8wBu~p%r}XqXaW5-L^dOwrGsfC-dn1Z&QLgm@XxL3O_EUp+Xvpm-@3~h zX98ZxvQJorqQ}2#Pu?AZ*TEI@YbJu-q(9to3k`y_kZUfU4wkL@`K<$orR_JGufQ3dZ2|15lGHW0fnY}n7ry6* zenSUp5;lbv9M#mxSnJ6-c?cX~XNeJ`2E&>*uj~o2<1@#}&B};wu#7?==VX}``B)P6 zCO@Dx<74_t@ny-pX|xiotKdWK%YVPnmKsC#Af*{(NLQvSKpLB~W(`5MD#ue0)zM>- zNcQ2tSHy8oa=nTZ1Zx;O2~GEV0S%Cx?ggVAN{+(b!zzdMdY7@eDya^KfZI_Ur4UF@ zVhj{d)!Zc38m92D^t~i!z^!Bxm4pWmJks7^fxJ08IPn9R?dG|7HHK3R_3xCSGCYob zvCJkvPqrF(`-}TGK|C{M6~ZRme$|PUjS2U*s;R|JlcuNJ5)FJu^TRNdIR-Ke>C_D; zr*skHE~ir6RWeLs=nJ^r^V1rjl*{DASeX@o`CB(OFft^V{KwFOG{?WLrAKW2+QSJ4 zcQ1!?qHYrQilF)uq8mZbZiCT+p=~|k5q|bwa5yn$03KwTe4n0p(+~_A^{1qR zy(Xb=C>Z3`S9_H`QEfUd)F?f)4Lkz}GnwDbjn`6ArRFcKwe$frni4waQ;{w(CiZ{m z6eozC{RYzHk`6K*I^taY+At^KyN;7>qZ$(z^s(f9fFXOVEEv2kfYzO}+3B@xRkpbe zso1MYFt>BjEzsYy((H~&5M1_c87hGc4>2>Bfg84Kca_3hj>!NYHQ(kDE(piSAgaxY z^9#GJ$%fL09_3|>N}tex(5geDDLDTMsN*E35%93bqU)S3w#iH()$EGW+;R9#Ky!$I zRAM=NX2QJKf|+DSW&wtED5id}K&-r#=+4KZ+BUDldj%HsnX)ow9FS@lxN z@W9LWb2TvP`B>I&#@CY7!T3#~3a9Cq)8rzM?2pR$EBuuzPn9U$pGE8;XHVlf-8f2(#zz;iR{PX% zT9H$^CllKm&<)kn9a^2;8Lv9^a-8mG@g7fK@BLh#x2sd$D6Xz(p=4U1CZ5GjR_%1M zb3b4*@hZvmOV-e!zC+Ww%2K;Bk#_%V+Hh-7s8^zmVWO0~>{A;W)3o7KVy%p*)FGk( zV=F=i>+bcK2jnBwH(NqWVTnQc&J1uQe+>zQ0;k?;RJYN;a=tENiMuYk?XUr zC2<=^r3fMh8d1u{BHT#Pyf33j{i8=V)1}`Ktx0^vs>L7ne1OzpTdW|A^(p<>)})X zLA{8s6ecA2Zye*+h|%om!wH<*id>beO^o^XSHrI1UV(uqm>&Ve+Fh7SipbdLO9>_{}shjXn^###vl3r z4_eG_lK(fJ`2Tm1?7y9O`1gnUq9gf^RSXHnDlxZM8wRWv@BAv`*Dw~!sx5W-MmN%R zCyv48(Uab-W*R&f9mmq`vUeh!l)5Fzo>CU2B!Ogg#XZo>e$316px5d2!|g~zxb#ap zgdoQd_ur3_$R@q(VR~YQ-mcfLv&z^gi?QEZX})ltjTD`A+!qul`XCIx3Qas(qO)~c3Sl_z_j)0g!a9W`!)BuMMJUnZ!33kuwgWmt#N z$8e_1k(xHjCT@Ay!Aq)7TE!lWg?lN}y2#3+fWIo-u7!93%gn0Y&DOww3Ql9ZWTOftvAhgoqX1xg)RQI)mM7K z`}bY?2e_?5U4A~~7#irib<5noD@};7c7rp$GMRiUxL;nyGLx9gsYJyi$;R6WP$1l; z)H)e0I3}+$Ttbw9oWK1TBNeZQ{M2Q;-R){`xbmWl&G_I5-ENjmAc%4eN7?J3CTqre zhbw6lZ8+4}p7=g~EPT?vORo&f&nQo^`S6gxZKg_}>8vt-~I!O!uT=;CPp#9RM z(Zs!p0i%nV?y7!Qw#sr?&#ypPn+?u>J3YZZ@dakdT^Z%Egms*%(Ft?uZo#flvDpy`MiBgCNUTVYo@ttO!3M^ zU>!K|*~WE0>0)DizMO4i6;2dEV;L|fi22AY`pBI4mSj=ydEv55)yj1BCv`S(N~JBd z{)TvZgKWqyPRzWF)ip00-0NgSjBTKp%3TunbqrxB+rap)W&E}{*Z8ta;?Pvq3BzB7 zh5OokBA~pgRDi0zLHKOYOjXdvg2bkFlv&?VgYCogjwo;?#fg@OJef^wH5gA$(Gfp( z$Ic@ubWSS{=`d_IYBz97@`{CS+T5Obm{RWL!Yy@EADg+_ys>~3Kkzlh zFe`4W+SQ#U0ixC^_Wh2XqbeNM%}Zx?ouoyg zIo(qx4ed*8@OF#rC;%UFz`WPpjW;v~+&raWjbT=Q&qv4L#P^5s)WK}g3Y=gOCmxR> zTCv}nsC>N2b6h=6+;Y|V1WopWO%b3 z=Uw_-!e(_k+NSS2CPEuAmh8$j#l&fL)dFoA4Otn(crRwu27jU|S7YZcfSVH`ENcU{ z-tHpgi)&^LjdC_z^F3||KQ1*kKGyNP5VbD^vLU<|y3o{5oiW?U3(3XAd+Thk{21tW zogD5Tez@FOg-lA*nG0Q&sU{N$vt87{^}Ow0T)(Ci?DZ(7vT^%!3lHOi2kNy9md>{& zKE$tNWw9hqEENB>KOQ;110Hf7O_3toYRl>+H4cRv>`+GH{(D3}q6Il;0u`a4+Bi)D zf`~@VGz+rJ+~MnWFexXC_fhD5>3Rg_-&t8jN_&#tm)BQ#kDMdQG%>nQ6poiS74-;?`@VO0o&PO&&oZoc?hPh&=l;HHCYOt5zYuXEW@r6!)W0xS}p*{#ydsTQh zn{gosTYdBh=M;$bqSr$b$V9WXF}oMfSDydcXxifs4d316@*E7$xNxHu#f3X_XC##W zr2;NWhoYG2Ctv4NKY6_1;Labcio<+n@`rnXUpG% zg|@RckDxk7^K>7wfulB?%BISLhSK;3W^<$$nA8%7-X^J!^)@bDJ)M2Ix<@{pM}a@n zA`}Ft;&MNg=Gz#ZlV(vpLyDP@A~?Dt;+4@U=skfKI> z)lEuYy_W998wzI3!kZ}0b~*XX2Q@+8eBH(8nr@6=%ty@+w(>g&7bvl)JWu?lCu64> zYlOPO2xr5oQLX^!xdb{ibb-?DeO{IN9IWqfHiUz;kq0`jI4AYeMI6>-b!E z^2uXAM^u@AUD&Yia*-Qm&o%Y{!DphPdi9`vL% ztUHHkz!VD@*egSHpOzu5#h#H?Mqg8w_Ds8W#FfH_#d86PsGbF|a7Fu7Yf+q7Y%p|J zE^|jZ&g8;m>&s1_d$O3z#|W+dB0sEYm3?m**aPnyY%uh+-0mBYPGr61oq7omxuoWA zIo4@uD{#p0d!N8-IzN`I)==)l?v3W(kX^9k?H2VvoLnqz{+T7Au_X>b1=UPF8*XK? z-&O-SS->?73kS!a#L)A}_{be{9>U;Flz+%5Vz!h`=xJhh1sq5cxnBS~q#-w$% zf505GmMU0IKNLb@+Siujmo$j*%UdpY^#9ZyIH%dFH4g4gyFgP>eg}@Tk-|jYSc;)v z&mShZob0@S`MW&CuFH^#U&=g&sOO)Cl>b7l{)FD)Ngl$mhsZG%G=gV$7Lt8fqB#@d z^TqGahkt*2*XXc9QSq*Az^?Fn!5{`Pa?KAK9eg6>txuJN3c~Lic8lFz_;HV`reLx} z9{*D?N^Jh^~TH|MAw(H)DN%ND;=qG zw`>G$zaQDSvPp+Pm=+foeSK%I$VQijw3lSlpXYZrgMpoluP8os6q2f|2~=KO4mSjz z4fUjXu3gQQF!y~W0_hIfYTRah!ilh8qe-y^aRgN*jytgiO{-*;ZPVLQl&T%+_Q#j7 zD3P#~P05>85b2goHo-cIGCbQdi7J!W$93MXzAVxQmrne$0lMX6R7M7Iq725rx7NyR6>TaKJAs6UI<6cxl5xtvnF z-v5<|t_T);<3^Ie^OD7y>;$qDbvE@%jEhW9JS&C0`{R_$Ln5unfH19)>?w7F1P&pRW;ogi;{EvW5PkClDFGfaT_Mw6Y`N>~AG<>jRx)5u$ASz(l(HjFJ) z^DRE=@EJmu4`}a`4Ms6buFMg}5hplQMlBwn2)=rPhp``R0Ha{{GZd32--t|4LWsr& zTJ#LKR|a;~)h8{orJPn@&7igx4aF0vhGy0BysbUg#E}k`hHU}uk_dEiWz$!#=l#Kb zIw6F$JZ04e_o)xvIO9ziApPE3Isu!OsI;Mv3kE7%xqMz9jJ{t)KC|{R)~D)K*nH~3 zWVqG*2B-Qr6*GIodntc7o6=^L=?zoDQbtvgPvcsbss_RPL@*O z=Nr}wUC|neC10puGYdwRCvUz(6?`Fo@Pp!oO=-x~I&3n22s)a)KM`l99Xl=YSQTq_ zDG|Lfls*BZ0e7zUIsZQRr=^K1>ErQ33WmBm+kTC6fyrO|KQ>W_EM3_W?=G=2T^nD@nxd5O8?`V(p$HlKq2pFR?x!h72R?VFR+D4&HV z-q>vW_$dT(YszhR`&@K>aXjyGV2iPT-m>gv>B)2_igD8o(&HlzD*Q?xWUqhb|K4ZY z8k;T*=x(jmX*8=2B2JGC3mikQsj++onPD3aFQiZaXx3at&Vn3WYU z=tj0YsaR?uC()W|Z)$HEVg0Gt(+9rzDw2A$$*KFxS*u9*7wK-;EG3GRJ)|&*=g!F{ z6O-*^Q}M06nfRYnofiSau8cdA#&ixE60bTNIo`7)*X9=I#;e*Y^eJ6vUs7#nZ;a?; z7zAtz)EY9{{m1mYEt(Z4HqlWJ9>kvc(l1Ik3IH(Ad3s}5Lm^k2%#A*iyI(5w(<;zn zU&&RP{2Y9JFh-i=39EY4yb8|nB4vLs;ttyfKU9yfo_Qv`=x9~0wGgdR2V2`~1l`M# zz7@n{b=Z%H+ptU`b!icBD-zQ=c#gA^Ul_e6cM;6}(e=I!CZ;l}(zGMT8zZz}CoZXA z$<6>RS;e|%6!{hLl;+JP3~*YR3SO~fUy)_@E99sa!w{r3^LLHc+1AU-!}5?zwFcjV zY>d*3Z)d=$_sM!_o+{)@E&h?%_J{ju?dBE?hZ->-7d5||VOKx^d?!)V;sA;?tkBzB zMwT8Mo9T_^qkZj~no!7CWS=iWlsY;t?-Fn+{z;22q6Ki-?pM+X=`N5!uiInZ)0--E zKZzsB3AmqvkI{R}AMO`-Z6}t}rOeB3uaqTzWyKSLpx>@HxoVsi`jyYR&EpqGH;U z=^MR(Of1vBRI{Y6<6aKx;zopA83RnQN59|K><&6u^0o_YN6o83I^W>{@^c~BF&r}U z%kdu}A(PPUVw5FrlTxn=bsSx|0ilwbiO^MMGQZj0*sut##-KTS%>(^&UaptH=YCB> zBR-*DJr>#RFqD>d@>>L}1)+AT*tcp_M+EC=h&l!;yIofZ3P665(LP8|%Q8DHv=7QJ zEr(1%5T_q?NBJ*uFU%^;Hun%OHjljDdM*}3tB#Cbeb`&^TK%CVE42eWu>MjN_%g)K zDFfMn)XwE$S}CqM&<=t4qD@OE%}#q|NLzbp`(kIrKO~?G&-wXY@?FFgsvoCj+FqQ3 zFI$Wmav)3F!kQ|WgV4ijRP#diH5_1PrmbOT)8z7*$;%R3SkVH%Zt@CT%h+=#^icPl zr8cDCDDJEXA|!aCwEAN>xsOHGGH)>a34jg(lPy~BwQ7n|ZEOib49|#iVs-c~0<{~G zWK^7_Sk2Gi?;!Ef)LI<|FMsJ!cOSJA{f>&nvZ=ibK%TQ2YnsxDS5 zMEyioC|)Hjk&{4keHK=RRAjxh+!Acq4FLV7G^Z?f$9G7Jhv6HEQCj(hT1Z-BcT6FY zvQ?$9k4&}*JrrekJst`ki(?ADP?;92O&1bey}8;Aafa4PFW{O>aQl+4=k2k5TGT!q zV8n@G0=<5D#8GhF(c*5JS+lRaG5OPH#{TL}A$%Dx4Q`N)OSe+RQuKXbz8;^a6jIL` z6nt^e-S-CndK@eWGsDDfSfC)P@FO`Bw{~ zrQ$dl2sxt3Acn!}kZdns5skAe%b9>I)RbUpn2-|!-Pbxh3uaFsGa%%ZDNDm1IEW!h z^$-*1B~CUGLV4{htVm1w*$pk2>HyG`Vrb;zD%MzaVr>J0)mh) zEl%7EPGc7G1JUJ>xM+l>{zVuyclQu><50%K`s`Jnf+^F9&zris(SR%M)r;8VzTzuz zT+LqaOFpw%&xuyj^7LMl7u%RHF?MkB-K?au}@h~0#5yb9hd-OaVL$@lmEjoC{Lv>q}J3 zs{2bheRbynQoxjZ0wVen=u3iC>qRcsT$_Nr;pXDM2=dZMIOl@brcWk{JSIjDorRSJQ|jYx2a-zi&D{Fl{G#3q8Z}9K9=Elu zs)QtFyAo)6)LWwaJkRg157PU#RD3l8rltCodQo&)wpW_>8+EjFi9!&nNxzcp41r{C z;l!2U`MIAzQAN{^vOA*FRR$>ssyU3%uHi|ACjddwl`kH^ktHftGa=bsU-LKSZ{mW%OJ|cbc&((tr=88JpWE3*f$!=3WAWYBudP?-`C_1d;1V!reAPa;dR`p8<0~~7L}=+ zNd(@c(kZ?zuD^ES2E3F{=%BEDV!eNm_n3Jg5GL~Cv2X3>EgC#-)_0!;dlOooe6G74 zE#c-Nb{~zk1ZhT5*7}-Xlt|RNYoH<3I^`Zv(AK;N=HwAib6ltpL7v7#*d_%{WBxz} z!zx#Jo;!ils(VY4PVaA8(hbfK}Z~S6n*laQ0GR0+OXxTG``-80CR46_kv+$IV0H>v2 zI-9^^dKP<2GNzM<-i}QJ3%_n1f)u@xX2P2nLuw}8#(dR{gSHE-yw_c@JdL1AyTz91 z)vAQ&2Cx__)MY{Sx(=;Nj(j9P$0NRG?sWUz#Zirn@7ydbH^9BN{4Q>DjUw9G+CHFU z%l#j98*?R`FZ}O4FwxX*K+S^%-;ukhZY8HZO`M*aa4p1lPv+#Qm|Exaa;;Mb)RpDq zRXL2cxUj3|<6k^3|D1E5Ag@f#n!qUBwnmPs@=rFDv~1ncP))Aqx3sRfGwz!aL9yFZ6wH!52kC&#bP-1yn`ErG@` z?!I=qX!1>vjo`ZJgJX@j6QYb`p83HPXNWA9FP0PV^`z4Dbiszb@aK?Csv!;#GU$nj z|0w%FtS*(Mt~pZS86sUhz@PU%?^y3dK{M*5k7TMkiLWpu)W6$Y&S~V~{pOKWOwC#0 zQzZ>nU$`6WTS@M1$D=L8Q^c-eV`W-t!JtV^dLLr=%+pf$ap}3@l21`+Io-a+uEDm0 zZ$QzzcqYi&*Rd5nhe_F9g}G~j$riRpT1w)6jkiJdVaBJ4^A}q%wwlAuH-cW0!>1wz z$(2+9Ng6?ayf~fLeLpU&$eh3ntv&gWnAeA1wUaL{XBQUlSV0uc19CquKFGH%OBCUZ zd;7f7M7AliHfY1Eo!>rjIcaI9`q~68sy(LOp`n@27M`1MZ%w0G!=GWB#>geJm?^qm zjNnT>Pu#J3-Mc)^i^#$8IbnO@sGvJWA5;a-{3YE>z#3l9=+mL_z+SnQ5X(eXipES` zjn6dPy$UzKh>0u&FVs!QsLnZC@DFsviO19yRA84X*xm_#bIh0YsPLn%WGJ(;UF7EE z_}S_pt+nmq_~Mqw%`FN|Ws?Vc$ocTmtUEL$sD`5X{*vU_zDBmtU)h`V(iU%~o1={x zJ{dB6uJ;IxQh~E6!sip$P7K*ee9Ea0qBRCA<6X!OPY0(oEnvGryfA)^kEMRQ;HQU) zPpmxQLpPjPgT>N@fw}a<4*Foj&3TER7P~%2$JTwvkAyraHTR}JVpkjviris&G9L8( z{SHQxVO~f*-Q9JmAgS)7T9wE_`vIb$vo$Yrzzk-R_Sm!dLi%3(=0zJuI3b^e9jTnL zY`ZmtfIsrlOib~78WC|m_y%-kzDM`Q(qFOxelC|MIMtfev6Xeh&!zkfe8fTH`?dCRaf()ub32br3$_P(K%|U!`R!$lu3il z!b>t`1r4daR$oEYfb5e-!tLH_um(@c34UiHV6}p(Bt+<=4S!IVVfR3iPxFiKLD0;X z?Pr=Aixt5{rxN5MfxDY#Owb|()?APGC}cce}#;RVQFL3QWz5zv9Y4F zi{>nsj#EaQKs=OF>o4KxiObF#VyeZWS8))of^++ep|a=24h16~emry^t^g3l%Yk$D zsGgAI76?

wG&?(^bkE2%;xOSpDm}RSZHF?&je7z1(T?yZ3|oWQtbJ)4clrXN{_z zbkhKr9G>L*xR;O8*pi@>#`{O`ABuKO(?&b>^Z!XpW?>}qw?@Uj;9_1&(3$&2J=~}q z@MIon_=P!Mu~nHL&(eH_*bFnU&%}DNyt4{aCmq(ELaF4hctg&2(V^;Y-M~p1(QQ&@ z8~Kk2zkEE7>Q@Hpr+&p+)xyGCXF1}j8_a$kZeuqScvq+}qrHYf_H)%l#3FK!(9QeX zNo`Zc(~Ylmp3*LoA2-e{Sd)e-8$Eb-@#7PUHG$%O;APOnH{)qHQ7X8!5Owg|)4Z-q z6q~L3E#}=Dup3ZrTi}NukuVGAOu5uzXP_0`wZMsb{azws7_ye#E?~-R_6;^;fzsmC zn}^xz`Ot(N)k(6v`iP?aUTOC4+NCvqwkGJaNHj2arSxH7Q$o-U*M%=O!z?|<8E@`Q zQu8aAN`Cp?u`-5|{RlLenw-Ge?@HLybtk^B2Kw-Q=x3Uw%|+@8w?2$`epEy|iJ-8# zJ_G8mUbywayVL=VYOws*EBm_P>DItD~282R(OmC=yix(b`aNMyHr3$Qx#+Rd2hzHAEs&gV2& zvBDUHlaKvH<4xGKI%gDx-jghPRVBXyAZ3^%;}!(3?1g|IkB&PiK+71cl@U_xkPtJ`)dV9*ns3rCVWnB;aYw{{*o;L zGV)-yJ8r97(nAaDH!G|)ZYT0t;%C;>-`IoBZzT$*&38|Ncft+ym)12ojbAVN$ zIBV-7-H;oX3*Z+n1Shy)H$B8uyjuRrZPt?iliL(oh|DKSxl2rReFDI?ZdK)=<0ts= zYf97@hOLUbYrtqO1Tw4DvCHKs&qIlj*T&_)M`lElX-sV!&(({zX`<_I9;d4o5QxBo ze@%Yb8MPZdOFrB|zYjKlIm>4~C}Nk5A{xYj62^ftElfF5ypXYp{M1uXuEng_I{Dmt zM|?E?I0dDS%L@|-ip)H_xLd1k<*Ka|2uRkGxgIIh0as5eqoAwoz~Fv+VsuMl{a+41sx`~c z_od+vVuKG{WBKe=eaxNUyWD!U!7+g7>qg==#Rj2;nrRu*4je9OHAHap8OZmwih~&= zGj?6H^LLsPe^^604L08-Gv_Tnm&UMI>=y~1_^deq{K~GZdH;z8;|u@G$6-le-Oa4{ z!aGxxL(tZfd?$(=gLAQWyXn^jlcBHuUV_487>?^uaj?C{r(=4WfgxJ5LW%+`3aw6z z=&Xroyz3}bd6p=nC-PA5}6gOH_wn&HtW4(3R-?e@qnuhrLNiy0Q zl)9c0v1y*XI_P2aA{96|6m&P?G(-o#_?eok&TqA5Gw0Hk4bi)N?;A>_D{XW*uHZ!^ za4<^FZ(;zyBDhzSq9X&|WaYcMjD6~1d6d$Wb5gBN-2Z4z@Pyv2c?zsrqh2%_L}PC> z5E(HZHFiQ|q;&zJ8_BEoYmP9OKOK1{bD`^grNE7K`8*l&YWas|iT|2*?ZD{qy_=R7 zk*%bsWMy2*#URT^pVVm1UNcY>Y@eije-c}M_Ta?*bGK#63ow<|finD=`ZC$iB7Lgb zKtD%blY@bX=#83lr(lQFH}h6HC+D=k1E6?Ds>35gdv8tANHV+LaLxDeVuk82BTd`P zjz!q82}98?b{e_B5=Cy*%d+DVN`h~TPBlIrRuf!3S>29IGwHl$iVKEIK57@c2Xhj(nGxx1 z|J+~VMs(^v+W|zve%0=B-UvBhlY_Ks#`eY!U_AMPQn#;JtZviXhkdEgNTnIm#PYtO zDv3@}o|uiLoj{qu81`qLo{a0_;$C0KWKQ2;FNU#R7C}m{Lk1OX^z{N0P=F8@2(|VT z3-%AgBT(e^lN%5IQ=nN-v16)eeIjr^E@9^0Ss>q20bS!eFZEsBHAg zsL_j2sV|-|0fP6d7ibC<%rC{=pPgly&zWlEc+>f~vCudnKe2%xE0{AQNl@oM%o^0i zneQ?!!G^f8ZIN?otBn_}G4$p( zdi(gW>Emcg##Z+Fp;}B4>uaAm=Gli|-!5&fWq@(XxG|x^<7wTc#@SgHwq4P$Dy*(< zA#Cx(G^4D~SRc@qQ~&-Azq^#MeKP5B?|kkPK3C07_VNn#K!N*X(w9+)S0N9Q735FT zm4c3Df7gd-uUs1Zxku&N2PdDd6~WSI>jHZ1!(8Xr$De|E{t4Kgu&CZWMle5oJu|A##Ng!*>6t*knZvjb&P) z>wj*8T0mnT_>qgB?=4(BSdn7d`?qQYy?}N3NO=AI(KxCa0CHEr{-{!3@I-bQ1-K%d*O z`RIdf?4g$hYX?Jn!dG1J-O^eU-8@kEHtdCVTHzV-MKZE<7V$}K>0uc9MPt^X!`cBMGv z@R2ZNN6Sl3HoG9G!$*H&C>774H-=VupeI;S>BQ#pt!hzvnA^>TN2uPAmoN1{UE4pg zzXy4c38kBe-FObs)-T1odAeWtw!^WX0ilCQmZ)MH(axE6DXqGR9x8w-mjKdG&{=Wu z#Ho$gv&qJh$`I2KOFf;^w8v8RpC@Ah$v_1W+&smdkFlqdtF!dK+84-Hg66KC_d7eG zckI`sMV?9TI?*}LNQx&K0n)Zx>$6=P1egK~rRx~LYFJ#QlH&5~u~0omM#hUR!`2^; z&F6fFRSSgQJ#8N^#0Bj(H+l!;(AI-kng;9#?1k5yDw;^Xhb}w;B>S=EhgY&BO6>9c zu3+-mJD&vdcrYQ^Jaq5#*99bs6k0ajaQ%=Vqm+WSOu~#X-lNu9*=hFuP*nSh@>^Tp z9b>)ivCg5iUkHm3_T6P^7Pr1f9(~KcG}8;Tua+F`L8yQ!FVCCn70zbd3Du7rATEuSCrt5sU*UMYj& z5?gI~0&JNmxThz|E=Tz&SOMwKt2i_mTToG?>hsk9=F~wj?S$Ks!n&@ZhhhjL=@4u0 z;XOe*Z>idVH)I9*N57iYm&EK3JTW3A8qx~-C-^e6KVy=}yua2v@iC@CJz$LwhTPaR z&WN>6979L&o{C3PUl>$xe{QmIv;BQ4aTPLb6l}V;inT1VisaUFLqU%le{yE7F^z9M z4)>v(?GoXz?5-g1jWa7lUNwqRxkQYBrkr`;h+UDGa%-eO<51tyD3usL3GT!bmC1yT z;}M3v9V^fRo*mk)>z@=AHFq3b67LM3$ill#th@L<@hqSOLEQpfHy=i3!l3Wu6cvqn zs;4skxq~~4xnK&s5oRE{hBcCfRcE~L_@?o+zhQJToHT?oX9SN|=`LeUYhZO7MaR;ZE$%V|`rdsgYCGh%T? zG-}9{Y^jMlxj%{MhPQ21x2tq6X~%wY6Kd-(ae1x~IE; za$j}}MyeyCU8&Xje%cvN-vV9brrenb{mOmTQ-LpXyH-J`>3j`V3{b;xZ-5Tq>6dgC z251uR&BvfiP^>0p&E8MaGVZiaWsmu#!swNgBo(87E4svizhW`^l%V9Ggg}leaX>55}m+Z_tkzb=Q5Q z+g1~4YK02t<>xE`{%q3jp6@4=YKy`Nk@x)aHU{w@qe!ELs}UY17~ROIvAK4t-<=T) zgzJ%#?uX#m>+=%obYD3hr#u=_4 zM5hnJ&8q*1GH=@9yo*K?FSol>AD_uFLJY9@MPlC5>-)N>p?oD-Qv|2oy;iKdbV=Av zz2!3{TqbKzb1w&Yo?Xm1bGr>MTlxHp;st&Uhs4M*qE0`rB0tX+;1E1CKeKCl^AY^`sa)%6mUaLhm}!(JF5Djd-~&AQ+seGJ zW;DzB&t8Q%>I8hVl2C!iXyc7sb>}u!B1xB3zS4Iu2?-I1K%TB?om=6P_6F{3JTm_I z>^I+B5^dXK3_pk-=G|d#$b2H!$Zt}KLhDy+0qO_w-nph3NZGA{U0|5Hrj^fsH*GD> zvoeSP#2uHGs#?t%H;~7mCh3~v^gZmSDsF{I?_@c!VFx6Ce9Xm~U$h2wW?SAl?-8#x zjtK*pxeK`>JqN0$>AGWLqKguF4<7bAyp=?G_M30THH6pW;2UFPKS)klrO^rQBf=xP z=<2s%oAIsM5<13s1^^E?nr~rGV`^qC!SQGs`AeTuY_qj2D$ZgSoJ)`AEa1Q z_XolMjIu@uf7cYSWEra9V)zk^lu^DorzR}ziWc`D&_jk{_9PBuxBiSx6f^qlU$be&cLvpq=p7cy^aze={VXr`@!I|nB-Aj zugd<}Zh*G9tfZljBV`*uh&u^Ab9tl{%{GkSg@#m~!$^D>KKAPsyuIC=+(tnsvCp;X zwKo0o>)%WCT43by;#mAi{b~iw%B(NCyQ)=oTChjd`~k@!Dzo!5H2RWT({#AR{37ju zbWxn$tTlERhq3ExjRC1lmvHn}hiI~Ctn;E^=wCRs)rdxOSSWjmGkJc{W297XKwa{j z^&~}9dgQ=v=&cvq%>ZjX*#)1oCfI+RPWv=Oj$j1!l$!I3#^dbC@_EnNd3gGs6*Nzh zICgopty8T0T_=fQ_xBn#syn_HCSh~H$dZ*6bb56xFGKY9e9d8m{==Zw8B8I4sp9US zc5{0RllEX?;{Dl`$>b-BMMt_ih#%9QWkBkESu92}4x7s`dHq+mE6T^Ty>YiU2e=@T z*#;L4WJi_yGuydAiqgMNdk;8zzBD5v?+&J$_VT!LSl#GwCS zJ6+qHeh<{!S+ZQ_yYIoVyH(}Ks1>;uWRB+Ta>_6SX(CqCGyD^vg{y?(a!kLdqx6hb zKRC-}`fk#MI(YVY=zfVCG@NXEKe=MqUMA`88F1vT*SE<|k;!OXa>m_~T6buL-fOu! z&1FfepUhx>tny;e-#^Tw-kjdFz;)ghuR561DE!ezZfDrX2NBJ>_)Ryd;VD@paB||8 zN>lB20bRX#7?ZB~H{ zM`l%99%N~r_`kid*}Gh0Q?<9*)_r>y44sdNzYkurEi!F8)aYEfs=N@-q z`jET81A70@_N?#{D{O5c3Ht?C22)=Xh6g5n2lks}>UNh3pe7^Q^jz6LvVkdyr&iEY z`HpPMRI*mjL^BEn7~>WhEE1m9fwZOaX1dKKAS1s<>ew=y`VkE4@bx zG@n*tcG|JR*}8}BPPpc#JoGB#wk}Z&@b5p9MB`JXa}HHn!^FJ5bBLL>>YeGfd0SHR zu56KzY=3mp`W(QV%%<}=jpbmUJ|+{;*zFW6XDIkYIcFvB&JV$LH;s-&%n!I>pc)5* z?BUa|Cah62YZgfvWS0_pho92^P`FaF#$v1=)yCA-RTfvM)uC26YSlk728Y~FG2W0k zwpWNKWm^o>B~aUJhrHSuaA4PL&SfhrTs#wEL~XXvqR2B9WaMv5+_9ey+%c4`m!7V- zf0Fk>>L}n6Bq{>-pCTjiJm0u6YCX7|U_ldkN%G!>`A(lIv(3JQJz1{wNF9$IeJzx) zLa6$(33jx!rfa&66S_I{AuGwXKT#TCv88x$#+m0sNxh!L`ebR8x3e1ajluqP3z^SP zCi(o3@57$7H&`M|s1TgI^V8Gp#>SMJRllsbxH#*~k(0s;%B>v+2ff2z?e_P8chSFf zEv+(*WLO4}Ps0kKI9yj|kqq<==zbjP+56}DeQM=tF#MT>G!w&hgKh-9l|1`~{G6^Z z0sR@i-w(=XKA#Qj*8w}I)qNcn`TL0`$I;3-=|&wx-Yy_39n}#3S%?7NO~L;#goJ7ORFGVoBHlGX_S?$~}N(_SIVRRe05S#nX#JU_g*!r<|Pi|8Bw z)dQn2l3)L@p2Y2^7jOQsLelf!7Vd$C#=KQN5-h9~4`*YELhOu7Q!6`n(~#R=J5J6l z_^hXh0U1;(9jg}8RB@jGOCPs={?>R^n1O{8ZJ- zhu0W}urk}e?-U@}VW8(x5&>P?PJ31JM=Y|E*F>%@**xB3@v{RyRqan8{+4hnYmc>DIdzN5S( zfFb{6ztXz0He;UkC1>|yW-MYE*>j&{;o7|qaA!31Ceo`D>#+k5%r3KKU4Sch%{n=b z)PenPNsB&I3jUpZao?goQPWB6%^kHWG@bD0H!i*lf*V&Wyj>*nY!tpo`dzr_chiAi zxjlS|Pct6!*W%imAD!H;h>~<2Pn5ABVz`J!s(Zk^r z5aNcu5dpxkP0t25;{}V0By%;LF{&{pEVmIIQ!O4Uky~sn+H?W!w|s5mwg!Q1CkFm# zz0Ro}K|5)_V$;sH-lP01KZg(Puo^L6DDBZK2R)=Y>Cu)_pN-L!IhGg&sJENH&&bhWwbncTD2K{bR<=UvmL~y-%iU4v z6Z%ze(w}7%$d#}2_7D!Xc=45?wtn&^uvce>U4y)AOV>hQAReqQyygX`7j7AN|Ef}5 zNhL%_^X508p5JgC!W35cVCbCtO+KxBuMs1+Qm=L;CFl(BSSpeq0rKeF!WZu|FEg&* zQe*h6wc>vlIOtcr-1gk*eYFKSWBmTluD?Nc_~n5Q9X8RWAgU$9~bnP@o;FX(78`N9po8{2x{E^ zD4+_wyBRIp0yi4HG3iaG_R03cSii{mBjL3kcPe)m_B(W-3(eYka1C+k@hver>^amo zqMLty&P}2LAXaFf{L0s$w;QvuH#!q@gVw(j|I0!D1MC6NN+?k$WxPyfiOOihvB%aR z*ZzN?cEQ#bHqt;ARHJ-cCJ?aH5Z$^H-Y2gISFx483{rP4gn;kx3QIe_dz9eNQz-N0vcQ89qi|AqUHreIPx7;Qih$Yl zK2)l&go%|qEMT&F zuwMSWH0o&f1~cjF7~|bxBXjU?&4=RlS+8On#`PZ)hn4L~I+4U?@bH)hY=&&32Kp}b z#zYThnE3cd&BWRrFbgL$90{v&@sxxc-a`>1-ZerKN>8Dg*Y8$URr%~;(<%AP-UCzm zJCd20D+D^-lN(^K@USIBQ#4ue0s%>TTYX=!1Asw1pMp0U=%?!{aA6ZkeBk_RcBj8J zyF@KS%hXR_AnX1^HP~Tc(Q$K4$0%0_s(m2Q|7`o@qam}DO zOizCYRaCbwS>AtwMb`G80B5F2@_gjHO&>p+Ych<+DX4&vy|O2PC25OoCnKm)@c#q_ zgOd#b$J=%GepD<8Q8tR;o~AS@FM1NLMP-<-Gu@z)dZKWT>rs6if$Vx7e$6t+gd#v; zpvgfmuj!_OG$0)%lBg@{PM5l-ZQej@P?>vC?^jl2V8=4+%6 zdH^DfGUW9Bz^y44_%}V}7v(z|8-fc!X~dvscf(|@+~L~9DK48uG5Wwf@??P#7D4Uk zs>d&m-Z@ZfVn5)BnwiPd+0gbZztry~wUi*fk8=8dQ0^yl!TXXS)AVoAhiJWlUq}Fu zAo`;gUqz3cl|G|SKi1>VSgc`*Sm;ym!gyR*I*3fcP*s(&0}H)s^NFowxhG_-uwogE-hyxdNwM{1A#$j0`ywFbyDxMUyByD^7^6@Wh-rgZo@Z8yDL zIMSEDq@Cks?oWvM=zDy_Wxg#pgOI!RFAXGAQq;&&Gis1_?Z>NI%zd^0$15b??DwlU z=Ix5@HzG*3H%Yg|M-|5=@Wa8v*D?|bh+%29j(rP+yFI+VdzY6!LRNjLl?4FOsTzY7 z`rVQ?AMj3x$5$7!l6MNvu8Muo7pMFFxA3FG6DmAhp+Xk)e0zAT^!PL2MHUU+HGT-) z?@ht;pC3m|9(i@6x3n;unU%VpGe@=Dx(1t|#6EWyzd7^rpccW<6}JlE(89bnC! zc>X|5J;7|v-f(&o(8M}#NBkS2j&0Cipw;VjZs#jTiMP0QF%%&<4f9n19@II-d?ti0 ztU0}=>dGSONm%uyzxS9L&;RED>6i;YTU>z@OtRR?5Pj*Ls>dk6g8$p^mL6a5iCT!} zSa2@bffKUpnLK=J~IxLb*R0P?K3c%1jSBV2$fj!FJKd(o3OU=C5% zeCb^MmYFNGzPsf6$=(yC#r0{g{y{phuS-ON7QqQj9Stt^#| z6mg+^4=c@QMv^+Jpm%0M6;B-frbHnsd%D+Uue?Axfa*wy^Si_1^d@qs#wPD`8|&-2 z=PAPK;Hi9I9t(5B5AX-9@L*R_P2*zAJSy4Yp@kg7kI8g2_o%c-J5SO%T0%Kx)wae$ zv#-j@AZLrw!_8D9f@6PXtV7X5sTRRCHjIWa-~&w+vlIdP@4I;%f$*=n>+%cjA)lN& zHa+TY)Ni=2>5&iX6Z0+6_yoo?adsCnkCw{7^~D)P$Y>n$;u7#(XY~*j2nyJ#O@}A17>r3esYAcYa72SMGaDvh`fAq{fjFMCR z;mjl`(*sK<`d*oFNXuidpm!JJQ2Q9AZqRsEVS+V&mcmPL>J(=;pS6nM|QYkjc+ z8cou9dewU9)zz5q5DaC?Z(OTC`#^C_e77OXaqG+yK_T!k(P^=@cs`}2&zrxU?nXF$ z$ISk_w7#2d1_nK`y(^nkA~KkbPQGQu%baek8OhVuOzzqMUeKav?GoZJQ3FxRjNEEy z9@%-&uHRftSD10g7~PijN3yZp3Sp=A$gX!AZ8c%kn%cjVZdWBWQ&glvQo#7gYlW+- zBuf4i^Oc_Br-JhZf8?Xb-78sDaP+C>WrDM}bh4 z`yan^^6c&Fu3g{`$#Lf=A03|JI(bw>x|spqQ<;cz2*uVPH_<{7?xs;>D=UmStb zwZ z#dqCU5I%ACn@;D0!_I=iD(}*%cCTC{L>AVh?Jdw0!BiiZ4HOhcqG>2pv4Zd2_Y*9T z1ST<>*EFE2)*p2U!ox0FoOUn)MqMB6@E~O2i(fTI+a|IG>sNsa|Ad{4=wX?25q5U= zI<~%q9m{1iRLezk-bixu+4mcK3k$kodp>~W*ArRZ<=f*ct8Y<@top@9=`3KsKcm{S&7Ck z-vQ;X+SX3|vypZ37q|iFQDAi0p9PNon?3_YxUagS3$DqNPz`4$)!Q&sf7o836ZV-uvfRrM5kVdbQ+kO zhU*Ufo0p_=RuT+HkH+({`oCMB&1o3x-ga>O9BK6)f$EO%vc{%9U~}AZdJzw8aC`EY zPK34qOwlw{=Kg&Bi|@-%V4B;fxJ0Zu-&QxTzlnt-9#Uh^dKI439*rr0N>a4#Pl-l7+E7%=QSm0?6z2*>Q}j7vwK)=w5>KV%~-@s)=Jw5%y)s$i)PY7a;`^ zATMOp7?zt~8?mLPv|q%f_2wmxn6?oKCy!aZUv2+4&GAquGeC!uTv}EZflS_>9ol$W z;hfeKBAYl<=ONZjF-j0xw7D5dg& zVNOB!HKz;<*6f{zS=x?s#Hv?Eej;9$)hN;s3 zaYu~-s;D+nUw_b>Qk=67VS*8MLXkSO{{0;x5(!+E{$oVIA)G%#Es6Mv4onZddi-)oQ3aTX)M~50P+=7yS<*mNuCGN4 zqB=`wv3}_VIG|q`6>mzp5%xRS66eTb9YRD%ByDXMHE3Ds^Aze#5#|@B?wy?M=oG8W zYy&NJ4(!NJ@`7&3!PQZe<;|~To9+pi%su!EvGvWOPqxo<>IK^;=<%2PLSdNiF|Kl} z>R{jK^VW|Wc$=^lE+;J|{8T3v8My$zGGNw=vOD~F%sBen5a`3y=Xx0X(R@^TQfT|Sq^KnG>uvRUHWNph{Ea3 zi4L`hr0A~uEg4S_P6zMNjQ_8xr(e&t#{ch`r=u*olRu{O$bzLdon)M*EbPCt=B9JE zdT$Ev3M(fVRsN=nxqaoGf+RcT%fL8l)?~v4WU;In9!gv6qO&=b7N@HC@x{BMuMY?G zvsQ+FwC+VnuP77Ap|;<KKs*Mg~75>ZTCGG{Qv-U`WmeRz5+~tc5?|3MYF6qT$n(*xY63^3Yf+S{t4lN z^_SAYmGLwKPdSnkRx~%Kb#;kw+Aajn+t?X=N9Lf3`vw2KFHNU5r6Mz^HJ<9RH6xiz zM{x;RL`7x5fi!d+Urmf?F2VF+4H$K{Z&F6z<-zkNzq2~P?Y{k7o-p3jR%%4v(MaJ7 zzN;prv9N=A14W#Kg{zNa+hJtb!fRn@m3~ZV(j8uyAPsv$O-Qf$GXW{RuB^k*m;S*> zF`DV}b+OM=FLFigbEgr-CLEm0wr|B|N@3LILZfx%F$1xz5>f$Y=2*lJMK7x4d#N1{ zMwU5iJHa<^fVJ}IOSUM|a{al{<*YX{E>Y^7rhpJSmUyx@jSXICmVk)|&WEIU{cOJI zgq<_aq&RhN>W^~n>yU|MR-eINJu2xk_+^Qo+eNHg2sdH7rJ0IprO(eflpIBpmDJ2S zmzdtJ9*p|Fm&) zERHJ5#-jj*!+Zhr5eeH9>G~cTc+-O*W<1gzJiWYW&J~}eJDS6N1iGhU+&+lg9`V^H zJG^!0*^xH}KWUM!sqd&r+;3o*3{9>-tpkSVeH20B}VAA6e4ICXNIw@f$| zVzpeKpdC^2xx8{t8@zWRqhXys7C$OrYPg~>(|Ie$AGt;pTKSAZvoLBfcp>=diskza zjalH)2lj>`)2^q##ry)#tN1-ru

NNt1P$r?@4#%z_x8+ON&|tJ*L6JY2V$HFizj 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 literal 66563 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 Date: Mon, 14 Jul 2025 15:58:38 -0700 Subject: [PATCH 05/10] draft --- docs/build-insights/toc.yml | 2 +- .../tutorials/build-insights-function-view.md | 8 +- .../tutorials/build-insights-template-view.md | 93 +++++++++---------- 3 files changed, 51 insertions(+), 52 deletions(-) diff --git a/docs/build-insights/toc.yml b/docs/build-insights/toc.yml index 5641215a9c..d5f07030b9 100644 --- a/docs/build-insights/toc.yml +++ b/docs/build-insights/toc.yml @@ -6,7 +6,7 @@ items: - name: "Tutorials" expanded: true items: - - name: "Troubleshoot function inlining on build time" + - name: "Troubleshoot function inlining impact on build time" href: ../build-insights/tutorials/build-insights-function-view.md - name: "Troubleshoot template instantiation impact on build time" href: ../build-insights/tutorials/build-insights-template-view.md diff --git a/docs/build-insights/tutorials/build-insights-function-view.md b/docs/build-insights/tutorials/build-insights-function-view.md index 6b78c38d12..35c96d5d19 100644 --- a/docs/build-insights/tutorials/build-insights-function-view.md +++ b/docs/build-insights/tutorials/build-insights-function-view.md @@ -1,11 +1,11 @@ --- -title: "Troubleshoot function inlining on build time" +title: "Troubleshoot function inlining impact on build time" description: "Tutorial for how to use Build Insights function view to troubleshoot the impact of function inlining on build time in your C++ projects." ms.date: 5/30/2024 helpviewer_keywords: ["C++ Build Insights", "inline function analysis", "build time analysis", "__forceinline analysis", "inlines analysis"] ms.topic: troubleshooting-general --- -# Troubleshoot function inlining on build time +# Troubleshoot function inlining impact on build time Use Build Insights **Functions** view to troubleshoot the impact of function inlining on build time in your C++ projects. @@ -128,8 +128,8 @@ Double-click, right-click, or press **Enter** while on a file in the **Functions ## Tips -- You can **File** > **Save As** the ETL file to a more permanent location to keep a record of the build time. You can then compare it to future builds to see if your changes are improving build time. -- If you inadvertently close the Build Insights window, reopen it by finding the `.etl` file in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. +- Use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time information. You can then compare it to future builds to see how your changes are improving things. +- If you close the Build Insights window, reopen it by finding the `.etl` file in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. - To dig into the Build Insights data with Windows Performance Analyzer (WPA), click the **Open in WPA** button in the bottom right of the ETL window. - Drag columns to change the order of the columns. For instance, you may prefer moving the **Time** column to be the first column. You can hide columns by right-clicking on the column header and deselecting the columns you don't want to see. - The **Functions** view provides a filter box to find a function that you're interested in. It does partial matches on the name you provide. diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index fdba6806a9..3177e3af3d 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -1,35 +1,35 @@ --- title: "Troubleshoot template instantiation impact on build time" description: "Tutorial for how to use Build Insights template view to analyze and optimize the impact of template instantiations on build time in your C++ projects." -ms.date: 7/9/2025 +ms.date: 07/14/2025 helpviewer_keywords: ["C++ Build Insights", "template instantiation analysis", "build time analysis"] ms.topic: troubleshooting-general --- + # Troubleshoot template instantiation impact on build time -Use Build Insights **Templates** view to analyze the impact of template instantiations on C++ build time. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. +Use Build Insights **Templates** view to analyze the impact of template instantiation on C++ build time. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. -Templates view will seem familiar to users of Build Insight's [Functions view](build-insights-function-view.md) due to similar UI and workflow. +**Templates** view will seem familiar to users of Build Insight's [Functions view](build-insights-function-view.md) due to similar UI and workflow. ## Prerequisites - Visual Studio 2022 version 17.10 or later. -- The **C++ Build Insights** component must be installed. It's installed as part of either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it is installed by following these steps: +- The **C++ Build Insights** component must be installed. It's installed as part of either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it's installed by following these steps: 1. Open the Visual Studio Installer. 1. Choose to modify your Visual Studio installation. - 1. Under the **Individual components** tab, search for and then select **C++ Build Insights**. + 1. Under the **Individual components** tab, search for and then select **C++ Build Insights**, then select **Modify** to install the component. :::image type="complex" source="./media/installer-build-insights.png" alt-text="Screenshot of the Visual Studio Installer":::The search box contains C++ build insights. The item C++ Build Insights is visible and selected.":::image-end::: - 1. Click **Modify** to install the component. - + ## Overview Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can noticeably slow down your builds. -In this article, follow along to create a project that demonstrates template instantiation impact on build time, run Build Insights to gather template instantiation times, and analyze the results. +In this article, follow along to create a project that demonstrates template instantiation impact on build time, run Build Insights to analyze that impact, and use those insights to make the build faster. -## Create a template test project +## Create a test project 1. Open Visual Studio and create a new **C++ Console App** project and name it `TemplateAnalysis`. 1. Create a header file called `Templates.h` and replace its contents with the following code: @@ -104,7 +104,7 @@ Template instantiation time collection is off by default to minimize build overh 1. You can also choose where to save the report by selecting **Store Build Insights reports in this directory** and specifying a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. 1. Select **OK**. -:::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantion checkbox is selected."::: +:::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantiation checkbox is selected."::: > [!Note] > Collecting template instantiation times increases build time due to the extra data collected. Only enable it when you want to analyze template instantiation bottlenecks. @@ -115,25 +115,16 @@ From the main menu, select **Build** > **Run Build Insights on Selection** > **R :::image type="content" source="./media/build-insights-rebuild-project.png" alt-text="Screenshot of the main menu with Run Build Insights on Selection > Rebuild selected."::: -When the build finishes, an Event Trace Log (ETL) file opens.The generated name is based on the collection time. - -## Understanding Templates view results - -When interpreting Templates view results, keep these points in mind: - -- **Empty view**: If nothing shows up in the Templates view, it means your build time isn't dominated by template instantiations. This is good news because your templates are not a build bottleneck. -- **Duplicate instantiations**: The same template instantiation appearing multiple times with different translation units indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. -- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. -- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations it triggers. +When the build finishes, an Event Trace Log (ETL) file opens. The filename is based on the collection time. ## Use Templates view to optimize build time -The **Templates** view lists the template instantiations that contributed significantly to build time. Columns provide information about: +The **Templates** view lists the template instantiations that contributed significantly to build time. The columns provide information about: - **Time [sec, %]** shows how long it took to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. -- **Specialization Name** shows each template instantiation, including the template arguments that were used. This helps you identify which template specializations are most expensive. -- **Translation Unit** shows which source file each template instantiation happened in. Multiple files can cause the same template instantiation if they include the same header with the template definition. -- **Instantiation File Path** shows where in your source code the template instantiation happens. This helps you locate the exact line of code responsible for the expensive instantiation. +- **Specialization Name** shows each template instantiation, including the template arguments used. This helps you identify which template specializations are most expensive. +- **Translation Unit** shows the source files where each template instantiation happens. Multiple files can cause the same template instantiation if they include the same header with the template definition. +- **Instantiation File Name** shows where the template is defined that is being instantiated. :::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: The Templates view shows two template instantiations of struct S3 taking most (79.448%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. The build time is 4.066 seconds. @@ -143,13 +134,22 @@ The Templates view shows two template instantiations of struct S3 taking most (7 - Expand a template to see its various instantiations and where they happened. - Use the search box to focus on specific templates. +### Understanding Templates view results + +When interpreting Templates view results, keep this in mind: + +- **Empty view**: If nothing shows up in the **Templates** view, it means template instantiations don't dominate your build time. This is good news because your templates aren't a build bottleneck. +- **Duplicate instantiations**: If the same template instantiation appears multiple times across different translation units, that indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. +- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. +- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations. + ## Improve build time by optimizing template instantiations -In the example, we can see that two template instantiations of `S3` are taking 79% of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation to be included in the build. +In this example, we can see that two template instantiations of `S3` are taking 79% of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation. -Since the **Instantiation File Path** and the **Specialization Name** are the same for both entries, we infer that there's one expensive template instantiation affecting both of our source files. This explains why the time of each of the two template instantiations are about equal. By including `Templates.h` in both source files, we are causing one template instantiation to add significant time to the build. +Since the **Instantiation File Name** and the **Specialization Name** are the same for both entries, we infer that there's one expensive template instantiation affecting both of our source files. This explains why the time for each of the two template instantiations are roughly equal. Including `Templates.h` in both source files causes one template instantiation to add significant time to the build. -From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which corresponds to this code in `Templates.h`: +From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which is instantiated in this code in `Templates.h`: ```cpp inline size_t LargeValue() @@ -158,17 +158,17 @@ inline size_t LargeValue() }; ``` -There are three main ways to decrease the cost of template instantiations: +There are three main ways to decrease the cost of template instantiations. ### Remove unused templates -Review the template in question and determine if it's being used. If it's not being used, the easiest solution is to remove the function or template. In the example, `LargeValue()` is being used by `LargeValue.cpp`, so we can't remove it. +See if the expensive template is being used. If it's not, the easiest solution is to remove the function or template. In the example, `LargeValue()` is being used in `LargeValue.cpp`, so we can't remove it. You can also consider removing include directives that bring in unnecessary template instantiations. It's easy to forget to remove header files when you're no longer using them, and unused includes can cause significant impact on build time. ### Move template instantiations to source files -For our purposes, let's assume that we need the template instantiation as-is. We can rely on the third approach: moving the definition that causes the expensive template instantiation to a source file. +In this example, we can rely on the third approach: move the definition that causes the expensive template instantiation to a source file. Since `LargeValue.cpp` is the only source file that calls `LargeValue()`, we can move the definition to `LargeValue.cpp`. This prevents the template instantiation from happening in every translation unit that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: @@ -185,9 +185,9 @@ size_t LargeValue() } ``` -Rebuild the project and run Build Insights again. From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. +Rebuild the project and run Build Insights again from the main menu: select **Build** > **Run Build Insights on Selection** > **Rebuild**. -The build time has significantly decreased. While the template instantiation of `S3` is still contributing to the build time, we've been able to roughly halve the total time by only including necessary template instantiations. You can see the count of `S3` instantiations is now 1 instead of 2. +The build time has decreased. While the template instantiation of `S3` is still contributing to the build time, by only including necessary template instantiations the build time is nearly half what it was before. The count of `S3` instantiations is now 1 instead of 2. :::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization showing reduced template instantiation time."::: The Templates view now shows only one instantiation of S3 instead of two, and the total build time is significantly less at 3.152 seconds. @@ -197,38 +197,37 @@ This technique scales well to larger projects. If multiple files included `Templ ### Optimize the template implementation -Look at the template instantiation and determine if there's a way to optimize the code. Some optimization techniques include: +Some other optimization techniques include: -- Using simpler template patterns -- Reducing the complexity of template metaprogramming -- Avoiding recursive template instantiation patterns that lead to exponential growth -- Use `if constexpr` instead of SFINAE where possible +- Use simpler template patterns +- Use `if constexpr` instead of Substitution Failure Is Not An Error (SFINAE) where possible +- Avoid recursive template instantiation patterns that lead to exponential growth -For more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/), which provides detailed examples of reducing template instantiation overhead. +For information about more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) which provides detailed examples of reducing template instantiation overhead. ## Tips -- You can use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time. You can then compare it to future builds to see if your changes are improving build time. -- If you inadvertently close the Build Insights window, reopen it by finding the `.etl` file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. -- Drag columns to change the order of the columns. For instance, you may prefer moving the **Wall Time Responsibility** column to be the first column. You can add or hide columns by right-clicking on the column header and selecting or deselecting the columns you don't want to add or hide. +- Use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time information. You can then compare it to future builds to see how your changes are improving things. +- If you close the Build Insights window, reopen it by finding the `.etl` file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. +- Drag columns to change the order of the columns. For instance, you may prefer moving the **Wall Time Responsibility** column to be the first column. You can add or hide columns by right-clicking on the column header and selecting or deselecting the columns you want. - The **Templates** view provides a filter box to find a specific template instantiation. It does partial matches on the name you provide. ## Troubleshooting **Templates view is empty**: This could mean: -- Template data collection is not enabled (check your options settings). -- Your build time is not dominated by template instantiations. +- Your build time isn't dominated by template instantiations. +- Template data collection isn't enabled. To turn it on, see [Enable build time data collection](#enable-build-time-data-collection). - Do a rebuild instead of a build. The Build Insights window doesn't appear if nothing builds, which may be the case if no files changed since the last build. -- Ensure you are using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. +- Ensure you're using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. -**Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Disable **Templates** view when not needed. +**Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Turn off template instantiation collection when not needed. For more information, see [Enable build time data collection](#enable-build-time-data-collection). ## See also - [Build Insights tips and tricks](build-insights-tips.md) -- [#include cleanup in Visual Studio](https://devblogs.microsoft.com/cppblog/include-cleanup-in-visual-studio/) +- [#include cleanup in Visual Studio](https://devblogs.microsoft.com/cppblog/include-cleanup-in-visual-studio) - [Troubleshoot header file impact on build time](build-insights-included-files-view.md) - [Troubleshoot function inlining on build time](build-insights-function-view.md) - [Build Insights now available in Visual Studio 2022](https://devblogs.microsoft.com/cppblog/build-insights-now-available-in-visual-studio-2022) -- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) \ No newline at end of file +- [Build throughput series: More efficient template metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming) \ No newline at end of file From e1793134bbd30e3629a3033d3ac17ddb9e946cf4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 15 Jul 2025 16:25:01 -0700 Subject: [PATCH 06/10] edit pass --- .../tutorials/build-insights-template-view.md | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index 3177e3af3d..f43f2eecf6 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -8,31 +8,31 @@ ms.topic: troubleshooting-general # Troubleshoot template instantiation impact on build time -Use Build Insights **Templates** view to analyze the impact of template instantiation on C++ build time. This feature is especially useful for projects that make heavy use of templates, such as those using template metaprogramming or large generic libraries. +Use the Build Insights **Templates** view to see how template instantiation affects C++ build time. It's especially helpful for projects that use lots of templates, like those with template metaprogramming or large generic libraries. -**Templates** view will seem familiar to users of Build Insight's [Functions view](build-insights-function-view.md) due to similar UI and workflow. +The **Templates** view works like the Build Insights [Functions view](build-insights-function-view.md). ## Prerequisites - Visual Studio 2022 version 17.10 or later. -- The **C++ Build Insights** component must be installed. It's installed as part of either the Desktop development with C++ workload or the Game development with C++ workload. You can ensure that it's installed by following these steps: +- The **C++ Build Insights** component must be installed. It's included in either the Desktop development with C++ workload or the Game development with C++ workload. To check if it's installed, follow these steps: 1. Open the Visual Studio Installer. - 1. Choose to modify your Visual Studio installation. - 1. Under the **Individual components** tab, search for and then select **C++ Build Insights**, then select **Modify** to install the component. - :::image type="complex" source="./media/installer-build-insights.png" alt-text="Screenshot of the Visual Studio Installer":::The search box contains C++ build insights. The item C++ Build Insights is visible and selected.":::image-end::: + 1. Select **Modify** to change your Visual Studio installation. + 1. On the **Individual components** tab, search for and select **C++ Build Insights**, then select **Close** to finish installing the component. + :::image type="content" source="./media/installer-build-insights.png" alt-text="Screenshot of the Visual Studio Installer. The search box contains C++ Build Insights. The item C++ Build Insights is visible and selected."::: ## Overview -Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as **Templates** view, which displays the time it takes to instantiate each template and shows which template instantiations add the most to your build time. +Build Insights, integrated into Visual Studio, helps you optimize your build times--especially for large projects like AAA games. Build Insights provides analytics such as the **Templates** view, which shows the time it takes to instantiate each template and which template instantiations add the most to your build time. -In general, C++ template instantiation happens quickly. In exceptional cases, some template instantiations can noticeably slow down your builds. +In general, C++ template instantiation happens quickly. In rare cases, some template instantiations can noticeably slow down your build. -In this article, follow along to create a project that demonstrates template instantiation impact on build time, run Build Insights to analyze that impact, and use those insights to make the build faster. +In this article, you create a project that shows how template instantiation affects build time, run Build Insights to analyze the impact, and use those insights to make the build faster. ## Create a test project -1. Open Visual Studio and create a new **C++ Console App** project and name it `TemplateAnalysis`. -1. Create a header file called `Templates.h` and replace its contents with the following code: +1. Open Visual Studio and create a new **C++ Console App** project. Name it `TemplateAnalysis`. +1. Create a header file named `Templates.h`, then replace its contents with the following code: ```cpp #pragma once @@ -63,7 +63,7 @@ In this article, follow along to create a project that demonstrates template ins } ``` -1. Create a source file called `LargeValue.cpp` and replace its contents with the following code: +1. Create a source file named `LargeValue.cpp`, then replace its contents with the following code: ```cpp #include "Templates.h" @@ -96,12 +96,12 @@ In this article, follow along to create a project that demonstrates template ins ## Enable build time data collection -Template instantiation time collection is off by default to minimize build overhead. To enable it: +Template instantiation time collection is off by default to minimize build overhead. To turn it on: 1. In Visual Studio, go to **Tools** > **Options**. 1. In the **Options** dialog, expand **Build Insights** in the left navigation. 1. Select **Collect Template Instantiation**. -1. You can also choose where to save the report by selecting **Store Build Insights reports in this directory** and specifying a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. +1. To choose where to save the report, select **Store Build Insights reports in this directory** and enter a directory. By default, it's saved in the folder pointed to by the Windows `TEMP` environment variable. 1. Select **OK**. :::image type="content" source="./media/tools-options-build-insights.png" alt-text="Screenshot of the project property pages dialog. The settings are open to Build Insights > Trace Collection. The Collect Template Instantiation checkbox is selected."::: @@ -111,45 +111,45 @@ Template instantiation time collection is off by default to minimize build overh ## Run Build Insights to get template instantiation data -From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. +From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in Solution Explorer and select **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. :::image type="content" source="./media/build-insights-rebuild-project.png" alt-text="Screenshot of the main menu with Run Build Insights on Selection > Rebuild selected."::: -When the build finishes, an Event Trace Log (ETL) file opens. The filename is based on the collection time. +When the build finishes, an Event Trace Log (ETL) file opens. The file name is based on the collection time. ## Use Templates view to optimize build time The **Templates** view lists the template instantiations that contributed significantly to build time. The columns provide information about: -- **Time [sec, %]** shows how long it took to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. -- **Specialization Name** shows each template instantiation, including the template arguments used. This helps you identify which template specializations are most expensive. -- **Translation Unit** shows the source files where each template instantiation happens. Multiple files can cause the same template instantiation if they include the same header with the template definition. -- **Instantiation File Name** shows where the template is defined that is being instantiated. +- **Time [sec, %]** shows how long it takes to instantiate each template in [wall clock responsibility time (WCTR)](https://devblogs.microsoft.com/cppblog/faster-cpp-builds-simplified-a-new-metric-for-time/#:~:text=Today%2C%20we%E2%80%99d%20like%20to%20teach%20you%20about%20a,your%20build%2C%20even%20in%20the%20presence%20of%20parallelism). This metric distributes the wall clock time among template instantiations based on their use of parallel compiler threads. +- **Specialization Name** shows each template instantiation, including the template arguments used. This helps you find which template specializations are most expensive. +- **Translation Unit** shows the source files where each template instantiation happens. Different files can cause the same template instantiation if they include the same header with the template definition. +- **Instantiation File Name** shows where the template is defined. :::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: -The Templates view shows two template instantiations of struct S3 taking most (79.448%) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. The build time is 4.066 seconds. +The Templates view shows two template instantiations of struct S3 taking most (79.448 percent) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. The build time is 4.066 seconds. :::image-end::: - Sort by **Time** to find the templates that take the longest to instantiate. -- Expand a template to see its various instantiations and where they happened. +- Expand a template to see its instantiations and where they happened. - Use the search box to focus on specific templates. ### Understanding Templates view results When interpreting Templates view results, keep this in mind: -- **Empty view**: If nothing shows up in the **Templates** view, it means template instantiations don't dominate your build time. This is good news because your templates aren't a build bottleneck. -- **Duplicate instantiations**: If the same template instantiation appears multiple times across different translation units, that indicates that multiple source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. -- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold to avoid noise from trivial instantiations. -- **Time aggregation**: The time shown represents the total time spent on that specific template instantiation, including any nested instantiations. +- **Empty view**: If nothing shows up in the **Templates** view, template instantiations don't dominate your build time. That's good news because your templates aren't a build bottleneck. +- **Duplicate instantiations**: If the same template instantiation appears multiple times across different translation units, different source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. +- **Threshold filtering**: The view only shows instantiations whose contribution exceeds a certain threshold, so you can focus on the most impactful ones and avoid noise from trivial instantiations. +- **Time aggregation**: The time shown is the total time spent on that specific template instantiation, including any nested instantiations. ## Improve build time by optimizing template instantiations -In this example, we can see that two template instantiations of `S3` are taking 79% of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` are causing this template instantiation. +In this example, two template instantiations of `S3` take 79 percent of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` cause this template instantiation. -Since the **Instantiation File Name** and the **Specialization Name** are the same for both entries, we infer that there's one expensive template instantiation affecting both of our source files. This explains why the time for each of the two template instantiations are roughly equal. Including `Templates.h` in both source files causes one template instantiation to add significant time to the build. +Because the **Instantiation File Name** and the **Specialization Name** are the same for both entries, there's one expensive template instantiation that affects both source files. That's why the time for each of the two template instantiations is roughly equal. Including `Templates.h` in both source files causes one template instantiation to add significant time to the build. -From the **Specialization Name** column, we can see that the expensive instantiation is `S3>`, which is instantiated in this code in `Templates.h`: +From the **Specialization Name** column, the expensive instantiation is `S3>`, which is instantiated in this code in `Templates.h`: ```cpp inline size_t LargeValue() @@ -158,19 +158,19 @@ inline size_t LargeValue() }; ``` -There are three main ways to decrease the cost of template instantiations. +Here are three main ways to decrease the cost of template instantiations. ### Remove unused templates -See if the expensive template is being used. If it's not, the easiest solution is to remove the function or template. In the example, `LargeValue()` is being used in `LargeValue.cpp`, so we can't remove it. +Check if the expensive template is used. If it isn't, the easiest solution is to remove the function or template. In the example, `LargeValue()` is used in `LargeValue.cpp`, so you can't remove it. -You can also consider removing include directives that bring in unnecessary template instantiations. It's easy to forget to remove header files when you're no longer using them, and unused includes can cause significant impact on build time. +Consider removing include directives that bring in unnecessary template instantiations. It's easy to forget to remove header files when you aren't using them, and unused includes can significantly affect build time. ### Move template instantiations to source files -In this example, we can rely on the third approach: move the definition that causes the expensive template instantiation to a source file. +In this example, rely on the third approach: move the definition that causes the expensive template instantiation to a source file. -Since `LargeValue.cpp` is the only source file that calls `LargeValue()`, we can move the definition to `LargeValue.cpp`. This prevents the template instantiation from happening in every translation unit that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: +Because `LargeValue.cpp` is the only source file that calls `LargeValue()`, move the definition to `LargeValue.cpp`. This change prevents the template instantiation from happening in every translation unit that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: ```cpp size_t LargeValue(); @@ -185,43 +185,43 @@ size_t LargeValue() } ``` -Rebuild the project and run Build Insights again from the main menu: select **Build** > **Run Build Insights on Selection** > **Rebuild**. +Rebuild the project and run Build Insights again from the main menu. Select **Build** > **Run Build Insights on Selection** > **Rebuild**. -The build time has decreased. While the template instantiation of `S3` is still contributing to the build time, by only including necessary template instantiations the build time is nearly half what it was before. The count of `S3` instantiations is now 1 instead of 2. +The build time decreases. While the template instantiation of `S3` still contributes to the build time, including only necessary template instantiations cuts the build time nearly in half. The count of `S3` instantiations is now one instead of two. -:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization showing reduced template instantiation time."::: +:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization. The view shows reduced template instantiation time."::: The Templates view now shows only one instantiation of S3 instead of two, and the total build time is significantly less at 3.152 seconds. :::image-end::: -This technique scales well to larger projects. If multiple files included `Templates.h`, each of those files would have added the instantiation time of `LargeValue()` to the total build time. By moving the definition of `LargeValue()` to a dedicated source file, we minimize our build time. +This technique works well for larger projects. If multiple files include `Templates.h`, each file adds the instantiation time of `LargeValue()` to the total build time. By moving the definition of `LargeValue()` to a dedicated source file, you minimize build time. ### Optimize the template implementation -Some other optimization techniques include: +Other optimization techniques include: - Use simpler template patterns -- Use `if constexpr` instead of Substitution Failure Is Not An Error (SFINAE) where possible +- Use `if constexpr` instead of Substitution Failure Is Not An Error (SFINAE) when possible - Avoid recursive template instantiation patterns that lead to exponential growth -For information about more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/) which provides detailed examples of reducing template instantiation overhead. +For more advanced template optimization techniques, see [Build Throughput Series: More Efficient Template Metaprogramming](https://devblogs.microsoft.com/cppblog/build-throughput-series-more-efficient-template-metaprogramming/), which provides detailed examples of reducing template instantiation overhead. ## Tips - Use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time information. You can then compare it to future builds to see how your changes are improving things. - If you close the Build Insights window, reopen it by finding the `.etl` file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. -- Drag columns to change the order of the columns. For instance, you may prefer moving the **Wall Time Responsibility** column to be the first column. You can add or hide columns by right-clicking on the column header and selecting or deselecting the columns you want. -- The **Templates** view provides a filter box to find a specific template instantiation. It does partial matches on the name you provide. +- Drag columns to change the order of the columns. For example, you might want to move the **Wall Time Responsibility** column to the first column. You can add or hide columns by right-clicking the column header and selecting or deselecting the columns you want. +- The **Templates** view has a filter box to help you find a specific template instantiation. It does partial matches on the name you provide. ## Troubleshooting -**Templates view is empty**: This could mean: +**Templates view is empty**: This can mean: - Your build time isn't dominated by template instantiations. - Template data collection isn't enabled. To turn it on, see [Enable build time data collection](#enable-build-time-data-collection). -- Do a rebuild instead of a build. The Build Insights window doesn't appear if nothing builds, which may be the case if no files changed since the last build. -- Ensure you're using Visual Studio 2022 17.10 or later and that the C++ Build Insights component is installed. +- Do a rebuild instead of a build. The Build Insights window doesn't appear if nothing builds, which can be the case if no files changed since the last build. +- Make sure you're using Visual Studio 2022 17.10 or later, and that the C++ Build Insights component is installed. -**Build is much slower with Templates view enabled:** This is expected due to the extra data collection. Turn off template instantiation collection when not needed. For more information, see [Enable build time data collection](#enable-build-time-data-collection). +**Build is much slower with Templates view enabled:** This is expected because of the extra data collection. Turn off template instantiation collection when you don't need it. For more information, see [Enable build time data collection](#enable-build-time-data-collection). ## See also From f3b5367ec25169703c78bbcab82ce6d7b1858598 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 16 Jul 2025 17:02:47 -0700 Subject: [PATCH 07/10] acrolinx --- .../tutorials/build-insights-function-view.md | 8 ++++---- .../tutorials/build-insights-template-view.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/build-insights/tutorials/build-insights-function-view.md b/docs/build-insights/tutorials/build-insights-function-view.md index 35c96d5d19..bd0ccd9e31 100644 --- a/docs/build-insights/tutorials/build-insights-function-view.md +++ b/docs/build-insights/tutorials/build-insights-function-view.md @@ -12,7 +12,7 @@ Use Build Insights **Functions** view to troubleshoot the impact of function inl ## Prerequisites - Visual Studio 2022 17.8 or greater. -- C++ Build insights is enabled by default if you install either the Desktop development with C++ workload or the Game development with C++ workload. +- C++ Build Insights is enabled by default if you install either the Desktop development with C++ workload or the Game development with C++ workload. :::image type="complex" source="./media/installer-desktop-cpp-build-insights.png" alt-text="Screenshot of the Visual Studio Installer with the Desktop development with C++ workload selected."::: The list of installed components is shown. C++ Build Insights is highlighted and is selected which means it's installed. @@ -61,7 +61,7 @@ When the build finishes, an Event Trace Log (ETL) file opens. It's saved in the ## Function view -In the window for the ETL file, choose the **Functions** tab. It shows the functions that were compiled and the time it took to generate the code for each function. If the amount of code generated for a function is negligible, it won't appear in the list to avoid degrading build event collection performance. +In the window for the ETL file, choose the **Functions** tab. It shows the functions that were compiled and the time it took to generate the code for each function. If the amount of code generated for a function is negligible, it doesn't appear in the list to avoid degrading build event collection performance. :::image type="complex" source="./media/functions-view-before-fix.png" alt-text="Screenshot of the Build Insights Functions view file."::: In the Function Name column, performPhysicsCalculations() is highlighted and marked with a fire icon. @@ -83,7 +83,7 @@ In this example, the `performPhysicsCalculations` function is taking the most ti In the Function Name column, performPhysicsCalculations() is highlighted and marked with a fire icon. :::image-end::: -Investigating further, by selecting the chevron before that function, and then sorting the **Forceinline Size** column from highest to lowest, we see the biggest contributors to the problem. +By selecting the chevron before that function, and then sorting the **Forceinline Size** column from highest to lowest, we see the biggest contributors to the problem. :::image type="complex" source="./media/functions-view-expanded.png" alt-text="Screenshot of the Build Insights Functions view with an expanded function."::: performPhysicsCalculations() is expanded and shows a long list of functions that were inlined inside it. There are multiple instances of functions such as complexOperation(), recursiveHelper(), and sin() shown. The Forceinline Size column shows that complexOperation() is the largest inlined function at 315 instructions. recursiveHelper() has 119 instructions. Sin() has 75 instructions, but there are many more instances of it than the other functions. @@ -106,7 +106,7 @@ static __forceinline T factorial(int n) } ``` -Perhaps the overall cost of calling this function is insignificant compared to the cost of the function itself. Making a function inline is most beneficial when the time it takes to call the function (pushing arguments on the stack, jumping to the function, popping return arguments, and returning from the function) is roughly similar to the time it takes to execute the function, and when the function is called a lot. When that's not the case, there may be diminishing returns on making it inline. We can try removing the `__forceinline` directive from it to see if it helps the build time. The code for `power`, `sin()` and `cos()` is similar in that the code consists of a loop that will execute many times. We can try removing the `__forceinline` directive from those functions as well. +Perhaps the overall cost of calling this function is insignificant compared to the cost of the function itself. Making a function inline is most beneficial when the time it takes to call the function (pushing arguments on the stack, jumping to the function, popping return arguments, and returning from the function) is roughly similar to the time it takes to execute the function, and when the function is called a lot. When that's not the case, there may be diminishing returns on making it inline. We can try removing the `__forceinline` directive from it to see if it helps the build time. The code for `power`, `sin()`, and `cos()` is similar in that the code consists of a loop that executes many times. We can try removing the `__forceinline` directive from those functions as well. We rerun Build Insights from the main menu by choosing **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in the solution explorer and choose **Run Build Insights** > **Rebuild**. We choose **Rebuild** instead of **Build** to measure the build time for the entire project, as before, and not for just the few files may be dirty right now. diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index f43f2eecf6..c9a57fe323 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -15,7 +15,7 @@ The **Templates** view works like the Build Insights [Functions view](build-insi ## Prerequisites - Visual Studio 2022 version 17.10 or later. -- The **C++ Build Insights** component must be installed. It's included in either the Desktop development with C++ workload or the Game development with C++ workload. To check if it's installed, follow these steps: +- The **C++ Build Insights** component must be installed. Either the Desktop development with C++ workload or the Game development with C++ workload includes it. To check if it's installed, follow these steps: 1. Open the Visual Studio Installer. 1. Select **Modify** to change your Visual Studio installation. 1. On the **Individual components** tab, search for and select **C++ Build Insights**, then select **Close** to finish installing the component. @@ -136,7 +136,7 @@ The Templates view shows two template instantiations of struct S3 taking most (7 ### Understanding Templates view results -When interpreting Templates view results, keep this in mind: +When interpreting Templates view results, consider the following: - **Empty view**: If nothing shows up in the **Templates** view, template instantiations don't dominate your build time. That's good news because your templates aren't a build bottleneck. - **Duplicate instantiations**: If the same template instantiation appears multiple times across different translation units, different source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. From eccf691d24eac56de752d27c4d701013fe87324d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 17 Jul 2025 13:27:26 -0700 Subject: [PATCH 08/10] small updates --- .../tutorials/build-insights-template-view.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index c9a57fe323..659a9f8c91 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -111,7 +111,7 @@ Template instantiation time collection is off by default to minimize build overh ## Run Build Insights to get template instantiation data -From the main menu, select **Build** > **Run Build Insights on Selection** > **Rebuild**. You can also right-click a project in Solution Explorer and select **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. +From the main menu, select **Build** > **Run Build Insights on Solution** > **Rebuild**. You can also right-click a project in Solution Explorer and select **Run Build Insights** > **Rebuild**. Choose **Rebuild** instead of **Build** to measure the build time for the entire project. :::image type="content" source="./media/build-insights-rebuild-project.png" alt-text="Screenshot of the main menu with Run Build Insights on Selection > Rebuild selected."::: @@ -126,7 +126,7 @@ The **Templates** view lists the template instantiations that contributed signif - **Translation Unit** shows the source files where each template instantiation happens. Different files can cause the same template instantiation if they include the same header with the template definition. - **Instantiation File Name** shows where the template is defined. -:::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations."::: +:::image type="complex" source="./media/templates-view-before-fix.png" alt-text="Screenshot of the Build Insights Templates view showing expensive template instantiations." lightbox="./media/templates-view-before-fix.png"::: The Templates view shows two template instantiations of struct S3 taking most (79.448 percent) of the build time. The Translation Unit column shows that both LargeValue.cpp and SmallValue.cpp are affected. The build time is 4.066 seconds. :::image-end::: @@ -136,7 +136,7 @@ The Templates view shows two template instantiations of struct S3 taking most (7 ### Understanding Templates view results -When interpreting Templates view results, consider the following: +To interpret the **Templates** view results: - **Empty view**: If nothing shows up in the **Templates** view, template instantiations don't dominate your build time. That's good news because your templates aren't a build bottleneck. - **Duplicate instantiations**: If the same template instantiation appears multiple times across different translation units, different source files are causing the same expensive instantiation. This is often the biggest optimization opportunity. @@ -145,9 +145,9 @@ When interpreting Templates view results, consider the following: ## Improve build time by optimizing template instantiations -In this example, two template instantiations of `S3` take 79 percent of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` cause this template instantiation. +In the example, two template instantiations of `S3` take 79 percent of the build time. The **Translation Unit** column shows that both `SmallValue.cpp` and `LargeValue.cpp` cause this template instantiation. -Because the **Instantiation File Name** and the **Specialization Name** are the same for both entries, there's one expensive template instantiation that affects both source files. That's why the time for each of the two template instantiations is roughly equal. Including `Templates.h` in both source files causes one template instantiation to add significant time to the build. +The **Instantiation File Name** and the **Specialization Name** are the same for both entries, which means one expensive template instantiation that affects both source files. That's why the time for each of the two template instantiations is roughly equal. Including `Templates.h` in both source files causes one template instantiation to add significant time to the build. From the **Specialization Name** column, the expensive instantiation is `S3>`, which is instantiated in this code in `Templates.h`: @@ -158,7 +158,7 @@ inline size_t LargeValue() }; ``` -Here are three main ways to decrease the cost of template instantiations. +There are three main ways to decrease the cost of template instantiations. ### Remove unused templates @@ -170,7 +170,7 @@ Consider removing include directives that bring in unnecessary template instanti In this example, rely on the third approach: move the definition that causes the expensive template instantiation to a source file. -Because `LargeValue.cpp` is the only source file that calls `LargeValue()`, move the definition to `LargeValue.cpp`. This change prevents the template instantiation from happening in every translation unit that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: +Because `LargeValue.cpp` is the only source file that calls `LargeValue()`, move the definition to `LargeValue.cpp`. This change prevents the template instantiation from happening in every file that includes `Templates.h`. Remove the current definition of `LargeValue()` from `Templates.h` and replace it with a declaration: ```cpp size_t LargeValue(); @@ -189,7 +189,7 @@ Rebuild the project and run Build Insights again from the main menu. Select **Bu The build time decreases. While the template instantiation of `S3` still contributes to the build time, including only necessary template instantiations cuts the build time nearly in half. The count of `S3` instantiations is now one instead of two. -:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization. The view shows reduced template instantiation time."::: +:::image type="complex" source="./media/templates-view-after-fix.png" alt-text="Screenshot of the Build Insights Templates view after optimization. The view shows reduced template instantiation time." lightbox="./media/templates-view-after-fix.png"::: The Templates view now shows only one instantiation of S3 instead of two, and the total build time is significantly less at 3.152 seconds. :::image-end::: @@ -208,7 +208,7 @@ For more advanced template optimization techniques, see [Build Throughput Series ## Tips - Use **File** > **Save As** to save the ETL file to a more permanent location to keep a record of the build time information. You can then compare it to future builds to see how your changes are improving things. -- If you close the Build Insights window, reopen it by finding the `.etl` file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. +- If you close the Build Insights window, reopen it by finding the *dateandtime*.etl file either where you specified it should be saved, or in your temporary folder. The `TEMP` Windows environment variable provides the path of your temporary files folder. - Drag columns to change the order of the columns. For example, you might want to move the **Wall Time Responsibility** column to the first column. You can add or hide columns by right-clicking the column header and selecting or deselecting the columns you want. - The **Templates** view has a filter box to help you find a specific template instantiation. It does partial matches on the name you provide. From 462cb9338103e556a8827c090a27e2c6cc79947b Mon Sep 17 00:00:00 2001 From: Raymond Chen Date: Thu, 17 Jul 2025 14:43:37 -0700 Subject: [PATCH 09/10] Simplify Callback overloads by using template parameter packs (#5983) The event.h definition now uses template parameter packs, so update the documentation to match. --- docs/cppcx/wrl/callback-function-wrl.md | 184 +----------------------- 1 file changed, 4 insertions(+), 180 deletions(-) diff --git a/docs/cppcx/wrl/callback-function-wrl.md b/docs/cppcx/wrl/callback-function-wrl.md index 777ea551af..dd804d4df0 100644 --- a/docs/cppcx/wrl/callback-function-wrl.md +++ b/docs/cppcx/wrl/callback-function-wrl.md @@ -20,166 +20,14 @@ template< ComPtr Callback( TCallback callback ); -template< - typename TDelegateInterface, - typename TCallbackObject -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)() -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4, - typename TArg5 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4, - TArg5) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4, - typename TArg5, - typename TArg6 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4, - TArg5, - TArg6) -); template< typename TDelegateInterface, typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4, - typename TArg5, - typename TArg6, - typename TArg7 + typename... TArgs > ComPtr Callback( _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4, - TArg5, - TArg6, - TArg7) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4, - typename TArg5, - typename TArg6, - typename TArg7, - typename TArg8 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4, - TArg5, - TArg6, - TArg7, - TArg8) -); -template< - typename TDelegateInterface, - typename TCallbackObject, - typename TArg1, - typename TArg2, - typename TArg3, - typename TArg4, - typename TArg5, - typename TArg6, - typename TArg7, - typename TArg8, - typename TArg9 -> -ComPtr Callback( - _In_ TCallbackObject *object, - _In_ HRESULT (TCallbackObject::* method)(TArg1, - TArg2, - TArg3, - TArg4, - TArg5, - TArg6, - TArg7, - TArg8, - TArg9) + _In_ HRESULT (TCallbackObject::* method)(TArgs...) ); ``` @@ -194,32 +42,8 @@ A template parameter that specifies the type of an object that represents an obj *TCallbackObject*
A template parameter that specifies the object whose member function is the method to call when an event occurs. -*TArg1*
-A template parameter that specifies the type of the first callback method argument. - -*TArg2*
-A template parameter that specifies the type of the second callback method argument. - -*TArg3*
-A template parameter that specifies the type of the third callback method argument. - -*TArg4*
-A template parameter that specifies the type of the fourth callback method argument. - -*TArg5*
-A template parameter that specifies the type of the fifth callback method argument. - -*TArg6*
-A template parameter that specifies the type of the sixth callback method argument. - -*TArg7*
-A template parameter that specifies the type of the seventh callback method argument. - -*TArg8*
-A template parameter that specifies the type of the eighth callback method argument. - -*TArg9*
-A template parameter that specifies the type of the ninth callback method argument. +*TArgs*
+A template parameter pack that specifies the types of the callback method arguments. *callback*
An object that represents the callback object and its member function. From ac99b48ed08dc36fcb2bd0af5bc28630c6064d85 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 17 Jul 2025 17:46:12 -0700 Subject: [PATCH 10/10] add metadata --- docs/build-insights/tutorials/build-insights-template-view.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/build-insights/tutorials/build-insights-template-view.md b/docs/build-insights/tutorials/build-insights-template-view.md index c9a57fe323..0a4e4850e5 100644 --- a/docs/build-insights/tutorials/build-insights-template-view.md +++ b/docs/build-insights/tutorials/build-insights-template-view.md @@ -1,9 +1,10 @@ --- title: "Troubleshoot template instantiation impact on build time" description: "Tutorial for how to use Build Insights template view to analyze and optimize the impact of template instantiations on build time in your C++ projects." -ms.date: 07/14/2025 +ms.date: 07/17/2025 helpviewer_keywords: ["C++ Build Insights", "template instantiation analysis", "build time analysis"] ms.topic: troubleshooting-general +ai-usage: ai-assisted --- # Troubleshoot template instantiation impact on build time