|  | @@ -1,4 +1,4 @@
 | 
	
		
			
				|  |  | -#region Copyright notice and license
 | 
	
		
			
				|  |  | +#region Copyright notice and license
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Copyright 2015 gRPC authors.
 | 
	
		
			
				|  |  |  //
 | 
	
	
		
			
				|  | @@ -16,95 +16,18 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #endregion
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -using System;
 | 
	
		
			
				|  |  | -using Grpc.Core;
 | 
	
		
			
				|  |  | -using Grpc.Core.Internal;
 | 
	
		
			
				|  |  | -using Grpc.Core.Logging;
 | 
	
		
			
				|  |  | -using CommandLine;
 | 
	
		
			
				|  |  | -using CommandLine.Text;
 | 
	
		
			
				|  |  | +using BenchmarkDotNet.Running;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace Grpc.Microbenchmarks
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      class Program
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        public enum MicrobenchmarkType
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            CompletionRegistry,
 | 
	
		
			
				|  |  | -            PInvokeByteArray,
 | 
	
		
			
				|  |  | -            SendMessage
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        private class BenchmarkOptions
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            [Option("benchmark", Required = true, HelpText = "Benchmark to run")]
 | 
	
		
			
				|  |  | -            public MicrobenchmarkType Benchmark { get; set; }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        // typical usage: dotnet run -c Release -f netcoreapp2.1
 | 
	
		
			
				|  |  | +        // (this will profile both .net core and .net framework; for some reason
 | 
	
		
			
				|  |  | +        // if you start from "-f net461", it goes horribly wrong)
 | 
	
		
			
				|  |  |          public static void Main(string[] args)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            GrpcEnvironment.SetLogger(new ConsoleLogger());
 | 
	
		
			
				|  |  | -            var parserResult = Parser.Default.ParseArguments<BenchmarkOptions>(args)
 | 
	
		
			
				|  |  | -                .WithNotParsed(errors => {
 | 
	
		
			
				|  |  | -                    Console.WriteLine("Supported benchmarks:");
 | 
	
		
			
				|  |  | -                    foreach (var enumValue in Enum.GetValues(typeof(MicrobenchmarkType)))
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        Console.WriteLine("  " + enumValue);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    Environment.Exit(1);
 | 
	
		
			
				|  |  | -                })
 | 
	
		
			
				|  |  | -                .WithParsed(options =>
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    switch (options.Benchmark)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        case MicrobenchmarkType.CompletionRegistry:
 | 
	
		
			
				|  |  | -                          RunCompletionRegistryBenchmark();
 | 
	
		
			
				|  |  | -                          break;
 | 
	
		
			
				|  |  | -                        case MicrobenchmarkType.PInvokeByteArray:
 | 
	
		
			
				|  |  | -                          RunPInvokeByteArrayBenchmark();
 | 
	
		
			
				|  |  | -                          break;
 | 
	
		
			
				|  |  | -                        case MicrobenchmarkType.SendMessage:
 | 
	
		
			
				|  |  | -                          RunSendMessageBenchmark();
 | 
	
		
			
				|  |  | -                          break;
 | 
	
		
			
				|  |  | -                        default:
 | 
	
		
			
				|  |  | -                          throw new ArgumentException("Unsupported benchmark.");
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                });
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        static void RunCompletionRegistryBenchmark()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var benchmark = new CompletionRegistryBenchmark();
 | 
	
		
			
				|  |  | -            benchmark.Init();
 | 
	
		
			
				|  |  | -            foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                foreach (bool useSharedRegistry in new bool[] {false, true})
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    benchmark.Run(threadCount, 4 * 1000 * 1000, useSharedRegistry);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            benchmark.Cleanup();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        static void RunPInvokeByteArrayBenchmark()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var benchmark = new PInvokeByteArrayBenchmark();
 | 
	
		
			
				|  |  | -            benchmark.Init();
 | 
	
		
			
				|  |  | -            foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                benchmark.Run(threadCount, 4 * 1000 * 1000, 0);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            benchmark.Cleanup();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        static void RunSendMessageBenchmark()
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            var benchmark = new SendMessageBenchmark();
 | 
	
		
			
				|  |  | -            benchmark.Init();
 | 
	
		
			
				|  |  | -            foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                benchmark.Run(threadCount, 4 * 1000 * 1000, 0);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            benchmark.Cleanup();
 | 
	
		
			
				|  |  | +            BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |