Mercurial > pub > ImplabNet
view MonoPlay/Program.cs @ 124:a336cb13c6a9 v2
major update, added Drain mathod to AsyncQueue class
author | cin |
---|---|
date | Thu, 15 Jan 2015 02:43:14 +0300 |
parents | 0c8685c8b56b |
children | f803565868a4 |
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); } ) .Bundle() .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++; } } ) .Bundle() .Join(); t2 = Environment.TickCount; Console.WriteLine("Queue+Lock: {0} ms", t2 - t1); } } }