|
|
@ -20,14 +20,81 @@ using System; |
|
|
|
using Grpc.Core; |
|
|
|
using Grpc.Core; |
|
|
|
using Grpc.Core.Internal; |
|
|
|
using Grpc.Core.Internal; |
|
|
|
using Grpc.Core.Logging; |
|
|
|
using Grpc.Core.Logging; |
|
|
|
|
|
|
|
using CommandLine; |
|
|
|
|
|
|
|
using CommandLine.Text; |
|
|
|
|
|
|
|
|
|
|
|
namespace Grpc.Microbenchmarks |
|
|
|
namespace Grpc.Microbenchmarks |
|
|
|
{ |
|
|
|
{ |
|
|
|
class Program |
|
|
|
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) |
|
|
|
public static void Main(string[] args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GrpcEnvironment.SetLogger(new ConsoleLogger()); |
|
|
|
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(); |
|
|
|
var benchmark = new SendMessageBenchmark(); |
|
|
|
benchmark.Init(); |
|
|
|
benchmark.Init(); |
|
|
|
foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12}) |
|
|
|
foreach (int threadCount in new int[] {1, 1, 2, 4, 8, 12}) |
|
|
|