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(); var q2 = new Queue(); const int count = 10000000; var t1 = Environment.TickCount; new [] { AsyncPool.InvokeNewThread(() => { for (var i = 0; i < count; i++) q1.Enqueue(i); }), AsyncPool.InvokeNewThread(() => { for (var i = 0; i < count; i++) q1.Enqueue(i); }), AsyncPool.InvokeNewThread(() => { int temp = 0; int i = 0; while (i < count) if (q1.TryDequeue(out temp)) i++; }), AsyncPool.InvokeNewThread(() => { int temp = 0; int i = 0; while (i < count) if (q1.TryDequeue(out temp)) i++; }) } .Combine() .Join(); 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(); t1 = Environment.TickCount; new [] { AsyncPool.InvokeNewThread(() => { for (var i = 0; i < count; i++) lock (q2) q2.Enqueue(i); }), AsyncPool.InvokeNewThread(() => { for (var i = 0; i < count; i++) lock (q2) q2.Enqueue(i); }), AsyncPool.InvokeNewThread(() => { for (int i = 0; i < count ;) lock (q2) { if (q2.Count == 0) continue; q2.Dequeue(); i++; } }), AsyncPool.InvokeNewThread(() => { 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); } } }