|  | @@ -20,14 +20,81 @@ using System;
 | 
	
		
			
				|  |  |  using Grpc.Core;
 | 
	
		
			
				|  |  |  using Grpc.Core.Internal;
 | 
	
		
			
				|  |  |  using Grpc.Core.Logging;
 | 
	
		
			
				|  |  | +using CommandLine;
 | 
	
		
			
				|  |  | +using CommandLine.Text;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  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; }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          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})
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                benchmark.Run(threadCount, 4 * 1000 * 1000);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            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})
 |