public void TakeTime(int numberOfMessages, int numberOfSamples, PipelineInvokerMode pipelineInvokerMode) { Console.WriteLine($"Running {numberOfSamples} samples with {numberOfMessages} msgs and mode {pipelineInvokerMode}"); var profilerStats = new PipelineStepProfilerStats(); var results = Enumerable.Range(1, numberOfSamples) .Select(i => { Console.Write($"Performing sample {i}: "); var result = RunTest(numberOfMessages, profilerStats, pipelineInvokerMode); Console.WriteLine($"{result.TotalSeconds:0.#####}"); return(result); }) .Select(t => t.TotalSeconds) .ToList(); Console.WriteLine($@"{numberOfSamples} runs Avg s: {results.Average():0.00###} Avg msg/s: {numberOfMessages / results.Average():0} Med s: {results.Median():0.00###} Med msg/s: {numberOfMessages / results.Median():0} Pipeline invoker: {pipelineInvokerMode} Stats: {string.Join(Environment.NewLine, profilerStats.GetAndResetStats().Select(s => $" {s}"))}"); }
static TimeSpan RunTest(int numberOfMessages, PipelineStepProfilerStats profilerStats, PipelineInvokerMode pipelineInvokerMode) { using (var adapter = new BuiltinHandlerActivator()) { var network = new InMemNetwork(); Configure.With(adapter) .Logging(l => l.Console(LogLevel.Warn)) .Transport(t => t.UseInMemoryTransport(network, "perftest")) .Options(o => { o.SetNumberOfWorkers(0); o.SetMaxParallelism(1); o.Decorate <IPipeline>(c => new PipelineStepProfiler(c.Get <IPipeline>(), profilerStats)); switch (pipelineInvokerMode) { case PipelineInvokerMode.Default: o.Register <IPipelineInvoker>(c => new DefaultPipelineInvoker(c.Get <IPipeline>())); break; case PipelineInvokerMode.DefaultNew: o.Register <IPipelineInvoker>(c => new DefaultPipelineInvokerNew(c.Get <IPipeline>())); break; case PipelineInvokerMode.Compiled: o.Register <IPipelineInvoker>(c => new CompiledPipelineInvoker(c.Get <IPipeline>())); break; case PipelineInvokerMode.Action: o.Register <IPipelineInvoker>(c => new ActionPipelineInvoker(c.Get <IPipeline>())); break; default: throw new ArgumentOutOfRangeException($"Unknown pipeline invoker: {pipelineInvokerMode}"); } }) .Start(); var serializer = new JsonSerializer(new DefaultMessageTypeMapper()); var boy = new SomeMessage("hello there!"); for (var counter = 0; counter < numberOfMessages; counter++) { var headers = new Dictionary <string, string> { { Headers.MessageId, Guid.NewGuid().ToString() } }; var message = new Message(headers, boy); var transportMessage = serializer.Serialize(message).Result; var inMemTransportMessage = transportMessage.ToInMemTransportMessage(); network.Deliver("perftest", inMemTransportMessage); } ; var numberOfReceivedMessages = 0; var gotAllMessages = new ManualResetEvent(false); adapter.Handle <SomeMessage>(async m => { Interlocked.Increment(ref numberOfReceivedMessages); if (Volatile.Read(ref numberOfReceivedMessages) == numberOfMessages) { gotAllMessages.Set(); } }); var stopwatch = Stopwatch.StartNew(); adapter.Bus.Advanced.Workers.SetNumberOfWorkers(1); gotAllMessages.WaitOrDie(TimeSpan.FromSeconds(30)); return(stopwatch.Elapsed); } }