public void NotifyOverheadTest() { const int count = 800; var timeProvider = Time.DefaultTimeProvider; using (var group = new ThreadGroup(4, createBackgroundThreads: true, name: "NotifyOverheadTest") { DefaultConcurrencyPadding = 0 }) { var queue = group.GetQueueForType <SlightlySlowWorkItem>(); var item = new SlightlySlowWorkItem(); var beforeEnqueue = timeProvider.Ticks; for (int i = 0; i < count; i++) { queue.Enqueue(ref item, notifyChanged: true); } var afterEnqueue = timeProvider.Ticks; var beforeWait = timeProvider.Ticks; queue.WaitUntilDrained(10000); var afterWait = timeProvider.Ticks; var perItem = (afterWait - beforeWait) / (double)count / Time.MillisecondInTicks; Console.WriteLine( "Enqueue took {0:0000.00}ms, Wait took {1:0000.00}ms. Est speed {3:0.000000}ms/item Final thread count: {2}", TimeSpan.FromTicks(afterEnqueue - beforeEnqueue).TotalMilliseconds, TimeSpan.FromTicks(afterWait - beforeWait).TotalMilliseconds, group.Count, perItem ); } }
public void MultipleThreadPerformanceTest() { const int count = 800; var timeProvider = Time.DefaultTimeProvider; using (var group = new ThreadGroup(4, createBackgroundThreads: true, name: "MultipleThreadPerformanceTest") { DefaultConcurrencyPadding = 0 }) { var queue = group.GetQueueForType <SlightlySlowWorkItem>(); var item = new SlightlySlowWorkItem(); var beforeEnqueue = timeProvider.Ticks; for (int i = 0; i < count; i++) { queue.Enqueue(ref item, notifyChanged: false); // Notify the group periodically that we've added new work items. // This ensures it spins up a reasonable number of threads. if ((i % 500) == 0) { group.NotifyQueuesChanged(); } } var afterEnqueue = timeProvider.Ticks; var beforeWait = timeProvider.Ticks; queue.WaitUntilDrained(10000); var afterWait = timeProvider.Ticks; var perItem = (afterWait - beforeWait) / (double)count / Time.MillisecondInTicks; Console.WriteLine( "Enqueue took {0:0000.00}ms, Wait took {1:0000.00}ms. Est speed {3:0.000000}ms/item Final thread count: {2}", TimeSpan.FromTicks(afterEnqueue - beforeEnqueue).TotalMilliseconds, TimeSpan.FromTicks(afterWait - beforeWait).TotalMilliseconds, group.Count, perItem ); } }