diff options
author | José Rivero <jorive@microsoft.com> | 2018-08-16 11:25:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-16 11:25:31 -0700 |
commit | 6a2ce4748f043d8c0dc9e4d30d415cffbef1958f (patch) | |
tree | 080030fb7b20bd30b16b48c4cb355aa35a0dee0a | |
parent | fc449435e56ec439fb28b5426a5fbea645bb9d0c (diff) | |
download | coreclr-6a2ce4748f043d8c0dc9e4d30d415cffbef1958f.tar.gz coreclr-6a2ce4748f043d8c0dc9e4d30d415cffbef1958f.tar.bz2 coreclr-6a2ce4748f043d8c0dc9e4d30d415cffbef1958f.zip |
Add an empty console application to measure startup of the runtime. (#19490)
-rw-r--r-- | tests/src/performance/Scenario/JitBench/Benchmarks/EmptyConsoleProgramExecution.cs | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/src/performance/Scenario/JitBench/Benchmarks/EmptyConsoleProgramExecution.cs b/tests/src/performance/Scenario/JitBench/Benchmarks/EmptyConsoleProgramExecution.cs new file mode 100644 index 0000000000..6dbb5d9555 --- /dev/null +++ b/tests/src/performance/Scenario/JitBench/Benchmarks/EmptyConsoleProgramExecution.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace JitBench +{ + sealed class EmptyConsoleProgramExecution : Benchmark + { + private const string ExecutableName = "console.dll"; + + public EmptyConsoleProgramExecution() : base("Empty Console Program") { } + + public override async Task Setup(DotNetInstallation dotNetInstall, string outputDir, bool useExistingSetup, ITestOutputHelper output) + { + if (!useExistingSetup) + { + using (var setupSection = new IndentedTestOutputHelper("Setup " + Name, output)) + { + await SetupSourceToCompile(outputDir, dotNetInstall.FrameworkDir, useExistingSetup, setupSection); + await Publish(dotNetInstall, outputDir, setupSection); + } + } + + string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion); + WorkingDirPath = GetAppPublishDirectory(dotNetInstall, outputDir, tfm); + EnvironmentVariables.Add("DOTNET_MULTILEVEL_LOOKUP", "0"); + EnvironmentVariables.Add("UseSharedCompilation", "false"); + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + private async Task SetupSourceToCompile(string intermediateOutputDir, string runtimeDirPath, bool useExistingSetup, ITestOutputHelper output) +#pragma warning restore CS1998 + { + const string sourceFile = "Program.cs"; + const string csprojFile = "console.csproj"; + + string consoleProjectMainDir = GetRootDir(intermediateOutputDir); + FileTasks.DeleteDirectory(consoleProjectMainDir, output); + FileTasks.CreateDirectory(consoleProjectMainDir, output); + + File.WriteAllLines(Path.Combine(consoleProjectMainDir, sourceFile), new[] { + "using System;", + "public static class Program", + "{", + " public static int Main(string[] args) => 0;", + "}" + }); + + File.WriteAllLines(Path.Combine(consoleProjectMainDir, csprojFile), new[] { + @"<Project Sdk=""Microsoft.NET.Sdk"">", + @" <PropertyGroup>", + @" <OutputType>Exe</OutputType>", + @" <TargetFramework>netcoreapp2.1</TargetFramework>", + @" </PropertyGroup>", + @"</Project>", + }); + } + + private async Task<string> Publish(DotNetInstallation dotNetInstall, string outputDir, ITestOutputHelper output) + { + string tfm = DotNetSetup.GetTargetFrameworkMonikerForFrameworkVersion(dotNetInstall.FrameworkVersion); + string publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm); + if (publishDir != null) + FileTasks.DeleteDirectory(publishDir, output); + + string dotNetExePath = dotNetInstall.DotNetExe; + await new ProcessRunner(dotNetExePath, $"publish -c Release -f {tfm}") + .WithWorkingDirectory(GetAppSrcDirectory(outputDir)) + .WithEnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "0") + .WithEnvironmentVariable("UseSharedCompilation", "false") + .WithLog(output) + .Run(); + + publishDir = GetAppPublishDirectory(dotNetInstall, outputDir, tfm); + if (publishDir == null) + throw new DirectoryNotFoundException("Could not find 'publish' directory"); + + ExePath = Path.Combine(publishDir, ExecutableName); + return publishDir; + } + + private string GetAppPublishDirectory(DotNetInstallation dotNetInstall, string outputDir, string tfm) + { + string dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", dotNetInstall.Architecture, "Release", tfm, "publish"); + if (Directory.Exists(dir)) + return dir; + + dir = Path.Combine(GetAppSrcDirectory(outputDir), "bin", "Release", tfm, "publish"); + if (Directory.Exists(dir)) + return dir; + + return null; + } + + private static string GetAppSrcDirectory(string outputDir) => + Path.Combine(GetRootDir(outputDir)); + + private static string GetRootDir(string outputDir) => + Path.Combine(outputDir, "EmptyDotNetConsoleProject"); + } +} |