view MonoPlay/Program.cs @ 123:f4d6ea6969cc v2

async queue improvements
author cin
date Tue, 13 Jan 2015 01:42:38 +0300
parents 0c8685c8b56b
children a336cb13c6a9
line wrap: on
line source

using System;
using Implab.Diagnostics;
using Implab.Parallels;
using Implab;
using System.Collections.Generic;
using System.Collections.Concurrent;

namespace MonoPlay {
    class MainClass {
        public static void Main(string[] args) {
            if (args == null)
                throw new ArgumentNullException("args");

            var q1 = new AsyncQueue<int>();
            var q2 = new Queue<int>();

            const int count = 10000000;

            int res1 = 0, res2 = 0;
            var t1 = Environment.TickCount;

            AsyncPool.RunThread(
                () => {
                    for (var i = 0; i < count; i++)
                        q1.Enqueue(1);
                    Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1);
                },
                () => {
                    for (var i = 0; i < count; i++)
                        q1.Enqueue(2);
                    Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1);
                },
                () => {
                    int temp = 0;
                    int i = 0;
                    while (i < count)
                        if (q1.TryDequeue(out temp)) {
                            i++;
                            res1 += temp;
                        }
                    Console.WriteLine("done reader #1: {0} ms", Environment.TickCount - t1);
                },
                () => {
                    int temp = 0;
                    int i = 0;
                    while (i < count)
                        if (q1.TryDequeue(out temp)) {
                            i++;
                            res2 += temp;
                        }
                    Console.WriteLine("done reader #2: {0} ms", Environment.TickCount - t1);
                }
            )
                .Combine()
                .Join();

            Console.WriteLine("done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}", Environment.TickCount - t1, res1, res2, res1 + res2, count*2);

            var t2 = Environment.TickCount;
            Console.WriteLine("MTQueue: {0} ms", t2 - t1);

            t1 = Environment.TickCount;

            for (var i = 0; i < count * 2; i++)
                q2.Enqueue(i);

            for (var i = 0; i < count * 2; i++)
                q2.Dequeue();

            t2 = Environment.TickCount;
            Console.WriteLine("Queue: {0} ms", t2 - t1);

            q2 = new Queue<int>();

            t1 = Environment.TickCount;

         
            AsyncPool.RunThread(
                () => {
                    for (var i = 0; i < count; i++)
                        lock (q2)
                            q2.Enqueue(i);
                },
                () => {
                    for (var i = 0; i < count; i++)
                        lock (q2)
                            q2.Enqueue(i);
                },
                () => {
                    for (int i = 0; i < count ;)
                        lock (q2) {
                            if (q2.Count == 0)
                                continue;
                            q2.Dequeue();
                            i++;
                        }

                },
                () => {
                    for (int i = 0; i < count ;)
                        lock (q2) {
                            if (q2.Count == 0)
                                continue;
                            q2.Dequeue();
                            i++;
                        }

                }
            )
                .Combine()
                .Join();



            t2 = Environment.TickCount;
            Console.WriteLine("Queue+Lock: {0} ms", t2 - t1);

        }
    }
}