public void BenchSingleThreadEventExecutorWaiting() { var testSubjects = new Dictionary <string, IEventExecutor> { { "CompatibleConcurrentQueue", new TestExecutor("ConcurrentQueueCustom", TimeSpan.FromSeconds(1), new CompatibleConcurrentQueue <IRunnable>()) }, { "ArrayQueue", new TestExecutor("ArrayQueue", TimeSpan.FromSeconds(1), PlatformDependent.NewFixedMpscQueue <IRunnable>(1 * 1000 * 1000)) } }; var mre = new ManualResetEvent(false); CodeTimer.Benchmark(testSubjects, "STEE in loop ({0})", 1, this.output, scheduler => { var action = new BenchActionIn(scheduler, mre); scheduler.Execute(action); if (!mre.WaitOne(TimeSpan.FromMinutes(1))) { throw new TimeoutException($"{scheduler.GetType().Name} benchmark timed out."); } mre.Reset(); }); CodeTimer.Benchmark(testSubjects, "STEE out of loop ({0})", 1, this.output, scheduler => { var action = new BenchActionOut(mre); for (int i = 0; i < Iterations; i++) { scheduler.Execute(action); } if (!mre.WaitOne(TimeSpan.FromMinutes(1))) { throw new TimeoutException($"{scheduler.GetType().Name} benchmark timed out."); } mre.Reset(); }); foreach (IEventExecutor scheduler in testSubjects.Values) { scheduler.ShutdownGracefullyAsync(); } }
public void BenchSingleThreadEventExecutorWaiting() { const int Iterations = 10 * 1000 * 1000; var testSubjects = new Dictionary <string, IEventExecutor> { { "MRES", new SingleThreadEventExecutor("MRES", TimeSpan.FromSeconds(1)) }, //{ "Semaphore", new SingleThreadEventExecutorOld("Semaphore", TimeSpan.FromSeconds(1)) } }; var mre = new ManualResetEvent(false); Action <object, object> action = null; action = (s, i) => { var container = (Container <int>)i; if (container.Value < Iterations) { container.Value++; ((IEventExecutor)s).Execute(action, s, container); } else { mre.Set(); } }; CodeTimer.Benchmark(testSubjects, "STEE in loop ({0})", 1, this.output, scheduler => { scheduler.Execute(action, scheduler, new Container <int>()); if (!mre.WaitOne(TimeSpan.FromMinutes(1))) { throw new TimeoutException($"{scheduler.GetType().Name} benchmark timed out."); } mre.Reset(); }); Action <object> execFromOutsideAction = i => { var container = (Container <int>)i; if (++container.Value >= Iterations) { mre.Set(); } }; CodeTimer.Benchmark(testSubjects, "STEE out of loop ({0})", 1, this.output, scheduler => { var container = new Container <int>(); for (int i = 0; i < Iterations; i++) { scheduler.Execute(execFromOutsideAction, container); } if (!mre.WaitOne(TimeSpan.FromMinutes(1))) { throw new TimeoutException($"{scheduler.GetType().Name} benchmark timed out."); } mre.Reset(); }); foreach (IEventExecutor scheduler in testSubjects.Values) { scheduler.ShutdownGracefullyAsync(); } }