blob: a64c2979abefcee14c3ff2de959d13b9932d2092 [file] [log] [blame]
Jan Tattermuschc91bc022017-05-19 14:49:26 +02001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Jan Tattermuschc91bc022017-05-19 14:49:26 +02004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Jan Tattermuschc91bc022017-05-19 14:49:26 +02008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermuschc91bc022017-05-19 14:49:26 +020010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermuschc91bc022017-05-19 14:49:26 +020016
17#endregion
18
19using System;
Jan Tattermusche58842f2017-05-19 15:52:05 +020020using Grpc.Core;
21using Grpc.Core.Internal;
Jan Tattermusch645ae742017-05-22 08:46:26 -070022using Grpc.Core.Logging;
Jan Tattermusch8aeaacc2017-11-17 17:39:29 +010023using CommandLine;
24using CommandLine.Text;
Jan Tattermuschc91bc022017-05-19 14:49:26 +020025
26namespace Grpc.Microbenchmarks
27{
28 class Program
29 {
Jan Tattermusch8aeaacc2017-11-17 17:39:29 +010030 public enum MicrobenchmarkType
31 {
32 CompletionRegistry,
33 PInvokeByteArray,
34 SendMessage
35 }
36
37 private class BenchmarkOptions
38 {
39 [Option("benchmark", Required = true, HelpText = "Benchmark to run")]
40 public MicrobenchmarkType Benchmark { get; set; }
41 }
42
Jan Tattermuschc91bc022017-05-19 14:49:26 +020043 public static void Main(string[] args)
44 {
Jan Tattermuschff6c0362017-08-20 17:25:46 +020045 GrpcEnvironment.SetLogger(new ConsoleLogger());
Jan Tattermusch8aeaacc2017-11-17 17:39:29 +010046 var parserResult = Parser.Default.ParseArguments<BenchmarkOptions>(args)
47 .WithNotParsed(errors => {
48 Console.WriteLine("Supported benchmarks:");
49 foreach (var enumValue in Enum.GetValues(typeof(MicrobenchmarkType)))
50 {
51 Console.WriteLine(" " + enumValue);
52 }
53 Environment.Exit(1);
54 })
55 .WithParsed(options =>
56 {
57 switch (options.Benchmark)
58 {
59 case MicrobenchmarkType.CompletionRegistry:
60 RunCompletionRegistryBenchmark();
61 break;
62 case MicrobenchmarkType.PInvokeByteArray:
63 RunPInvokeByteArrayBenchmark();
64 break;
65 case MicrobenchmarkType.SendMessage:
66 RunSendMessageBenchmark();
67 break;
68 default:
69 throw new ArgumentException("Unsupported benchmark.");
70 }
71 });
72 }
73
74 static void RunCompletionRegistryBenchmark()
75 {
76 var benchmark = new CompletionRegistryBenchmark();
77 benchmark.Init();
78 foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
79 {
Jan Tattermusch8bae77c2017-11-20 19:59:40 +010080 foreach (bool useSharedRegistry in new bool[] {false, true})
81 {
82 benchmark.Run(threadCount, 4 * 1000 * 1000, useSharedRegistry);
83 }
Jan Tattermusch8aeaacc2017-11-17 17:39:29 +010084 }
85 benchmark.Cleanup();
86 }
87
88 static void RunPInvokeByteArrayBenchmark()
89 {
90 var benchmark = new PInvokeByteArrayBenchmark();
91 benchmark.Init();
92 foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
93 {
94 benchmark.Run(threadCount, 4 * 1000 * 1000, 0);
95 }
96 benchmark.Cleanup();
97 }
98
99 static void RunSendMessageBenchmark()
100 {
Jan Tattermusche58842f2017-05-19 15:52:05 +0200101 var benchmark = new SendMessageBenchmark();
102 benchmark.Init();
103 foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12})
104 {
105 benchmark.Run(threadCount, 4 * 1000 * 1000, 0);
106 }
107 benchmark.Cleanup();
Jan Tattermuschc91bc022017-05-19 14:49:26 +0200108 }
109 }
110}