Ejemplo n.º 1
0
        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
                    );
            }
        }
Ejemplo n.º 2
0
        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
                    );
            }
        }