performance/docs/sdk-scenarios.md

6.9 KiB

SDK Scenarios

An introduction of how to run scenario tests can be found in Scenarios Tests Guide. The current document has specific instruction to run:

SDK Build Throughput Scenario

SDK Build Throughput is a scenario test that measures the throughput of SDK build process. To be more specific, our test implicitly calls

dotnet build <project>

with other applicable arguments and measures its throughput.

There are 2 types of SDK build --- Clean Build and Build No Change.

  • Clean Build: simulates the first-time-ever build of the project, when binaries do not exist in the output folder. Between each iteration, the test harness cleans the output folder and turns off dotnet servers.
  • Build No Change simulates the build after the first-time-ever build. The test harness runs a warmup build which leaves the binaries, without cleanup between iterations.

Prerequisites

  • make sure the test directory is clean of artifacts (you can run post.py to remove existing artifacts folders from the last run )
  • python3 or newer
  • dotnet runtime 3.1 or newer
  • terminal/command prompt in Admin Mode (for collecting kernel traces)
  • clean state of the test machine (anti-virus scan is off and no other user program's running -- to minimize the influence of environment on the test)

We will walk through SDK Console Template as an example.

Step 1 Initialize Environment

Same instruction of Scenario Tests Guide - Step 1.

Step 2 Run Precommand

If you are running the test NOT for the first time and app\ folder exists under the asset directory, make sure it's removed so the previous test artifact won't be used. You can use post.py to clean it up:

python3 post.py

Run precommand to create a new console template.

cd emptyconsoletemplate
python3 pre.py default -f net9.0

The default command prepares the asset (creating a new project if the asset is a template and copying it to app\). Now there should be source code of a console template project under app\.

Note that it is important to be aware SDK takes different paths for different TFMs, and you can configure which TFM your SDK tests against. Howeverm your SDK version should be >= the TFM version because SDK cannot build a project that has a newer runtime. Here's a matrix of valid SDK vs. TFM combinations:

netcoreapp2.1 netcoreapp3.1 net5.0 net6.0 net7.0 net8.0 net9.0
.NET 2.1 SDK x
.NET 3.1 SDK x x
.NET 5 SDK x x x
.NET 6 SDK x x x x
.NET 7 SDK x x x x x
.NET 8 SDK x x x x x x
.NET 9 SDK x x x x x x x

You can change TFM of the project by specifying -f <tfm>, which allows to replace the <TargetFramework></TargetFramework> property in the project file to be the custom TFM value (make sure it's a valid TFM value) you specified.

Step 3 Run Testcommand

Run testcommand to measure the throughput of sdk build.

For Clean Build test, run:

python3 test.py sdk clean_build

For Build No Change test, run:

python3 test.py sdk build_no_change

The test result should look like the following:

[2020/09/27 23:51:22][INFO] Merging traces\emptycsconsoletemplate_SDK_build_no_change_startup.perflabkernel.etl...
[2020/09/27 23:51:22][INFO] Trace Saved to traces\emptycsconsoletemplate_SDK_build_no_change_startup.etl
[2020/09/27 23:51:22][INFO] Parsing traces\emptycsconsoletemplate_SDK_build_no_change_startup.etl
[2020/09/27 23:51:23][INFO]
[2020/09/27 23:51:23][INFO] Metric         |Average        |Min            |Max
[2020/09/27 23:51:23][INFO] ---------------|---------------|---------------|---------------
[2020/09/27 23:51:23][INFO] Process Time   |1621.667 ms    |1587.230 ms    |1706.269 ms
[2020/09/27 23:51:23][INFO] Time on Thread |969.075 ms     |414.988 ms     |1347.836 ms

Step 4 Run Postcommand

Same instruction of Step 4 in Scenario Tests Guide.

Command Matrix

  • <tfm> values:
    • netcoreapp2.1
    • netcoreapp3.1
    • net5.0
    • net6.0
    • net7.0
    • net8.0
    • net9.0
  • <build option> values:
    • clean_build
    • build_no_change
Scenario Asset Directory Precommand Testcommand Postcommand Supported Framework Supported Platform
SDK Console Template emptyconsoletemplate pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 Windows;Linux
SDK .NET 2.0 Library Template netstandard2.0 pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 Windows;Linux
SDK ASP.NET MVC App Template mvcapptemplate pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 Windows;Linux
SDK Web Large 3.0 weblarge3.0 pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1 Windows;Linux
SDK Windows Forms Large windowsformslarge pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1 Windows
SDK WPF Large wpflarge pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1 Windows
SDK Windows Forms Template windowsforms pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1 Windows
SDK WPF Template wpf pre.py default -f <tfm> test.py sdk <build option> post.py netcoreapp3.1 Windows
SDK New Console emptyconsoletemplate N/A test.py sdk new_console post.py netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 Windows;Linux