public void HundredQeWithThousandSubscriptions() { const int NumberOfEngines = 100; const int NumberOfSubscriptions = 1000; // Creating engines. var stopwatch = new Stopwatch(); stopwatch.Start(); var engines = new List <ICheckpointingQueryEngine>(); var tasks = new List <Task>(); var sources = new ConcurrentQueue <MockObservable <int> >(); for (int i = 0; i < NumberOfEngines; ++i) { var engine = CreateQueryEngine(); engines.Add(engine); tasks.Add(new TaskFactory().StartNew(() => AddSubscriptions(engine, sources, NumberOfSubscriptions))); } Task.WaitAll(tasks.ToArray()); stopwatch.Stop(); Trace.WriteLine( string.Format("Time for creation of '{0}' engines with '{1}' subscriptions each: '{2}' milliseconds.", NumberOfEngines, NumberOfSubscriptions, stopwatch.ElapsedMilliseconds)); // Sending events. var inputs = sources.ToArray(); stopwatch.Restart(); for (int j = 0; j < 100; j++) { foreach (var source in inputs) { source.OnNext(j); } } foreach (var input in inputs) { var result = MockObserver.Get <int>(input.Id); if (result == null || !result.WaitForCount(100, TimeSpan.FromSeconds(100))) { Assert.Fail("Not everything was received."); } result.Clear(); } stopwatch.Stop(); Trace.WriteLine( string.Format("Time for processing '{0}' events: '{1}' milliseconds.", 100 * inputs.Length, stopwatch.ElapsedMilliseconds)); }