Mercurial > pub > ImplabNet
comparison MonoPlay/Program.cs @ 119:2573b562e328 v2
Promises rewritten, added improved version of AsyncQueue
author | cin |
---|---|
date | Sun, 11 Jan 2015 19:13:02 +0300 |
parents | f3bdb7ba59b9 |
children | f1b897999260 |
comparison
equal
deleted
inserted
replaced
118:e046a94eecb1 | 119:2573b562e328 |
---|---|
9 class MainClass { | 9 class MainClass { |
10 public static void Main(string[] args) { | 10 public static void Main(string[] args) { |
11 if (args == null) | 11 if (args == null) |
12 throw new ArgumentNullException("args"); | 12 throw new ArgumentNullException("args"); |
13 | 13 |
14 var q1 = new MTQueue<int>(); | 14 var q1 = new AsyncQueue<int>(); |
15 var q2 = new Queue<int>(); | 15 var q2 = new Queue<int>(); |
16 | 16 |
17 const int count = 10000000; | 17 const int count = 10000000; |
18 | 18 |
19 | 19 |
20 var t1 = Environment.TickCount; | 20 var t1 = Environment.TickCount; |
21 | 21 |
22 Promise<int>.CreateComposite( | 22 new [] { |
23 new [] { | 23 AsyncPool.InvokeNewThread(() => { |
24 AsyncPool.InvokeNewThread(() => { | 24 for (var i = 0; i < count; i++) |
25 for (var i = 0; i < count; i++) | 25 q1.Enqueue(i); |
26 q1.Enqueue(i); | 26 }), |
27 }), | 27 AsyncPool.InvokeNewThread(() => { |
28 AsyncPool.InvokeNewThread(() => { | 28 for (var i = 0; i < count; i++) |
29 int temp = 0; | 29 q1.Enqueue(i); |
30 for(int i =0 ; i< count ; i++) | 30 }), |
31 while(!q1.TryDequeue(out temp)){ | 31 AsyncPool.InvokeNewThread(() => { |
32 } | 32 int temp = 0; |
33 }) | 33 int i = 0; |
34 } | 34 while (i < count) |
35 ).Join(); | 35 if (q1.TryDequeue(out temp)) |
36 i++; | |
37 }), | |
38 AsyncPool.InvokeNewThread(() => { | |
39 int temp = 0; | |
40 int i = 0; | |
41 while (i < count) | |
42 if (q1.TryDequeue(out temp)) | |
43 i++; | |
44 }) | |
45 } | |
46 .Combine() | |
47 .Join(); | |
36 | 48 |
37 var t2 = Environment.TickCount; | 49 var t2 = Environment.TickCount; |
38 Console.WriteLine("MTQueue: {0} ms", t2 - t1); | 50 Console.WriteLine("MTQueue: {0} ms", t2 - t1); |
39 | 51 |
40 t1 = Environment.TickCount; | 52 t1 = Environment.TickCount; |
41 | 53 |
42 for (var i = 0; i < count; i++) | 54 for (var i = 0; i < count * 2; i++) |
43 q2.Enqueue(i); | 55 q2.Enqueue(i); |
44 | 56 |
57 for (var i = 0; i < count * 2; i++) | |
58 q2.Dequeue(); | |
59 | |
45 t2 = Environment.TickCount; | 60 t2 = Environment.TickCount; |
46 Console.WriteLine("LinkedList: {0} ms", t2 - t1); | 61 Console.WriteLine("Queue: {0} ms", t2 - t1); |
47 | 62 |
48 q2 = new Queue<int>(); | 63 q2 = new Queue<int>(); |
49 | 64 |
50 t1 = Environment.TickCount; | 65 t1 = Environment.TickCount; |
51 | 66 |
52 Promise<int>.CreateComposite( | 67 |
53 new [] { | 68 new [] { |
54 AsyncPool.InvokeNewThread(() => { | 69 AsyncPool.InvokeNewThread(() => { |
55 for (var i = 0; i < count; i++) | 70 for (var i = 0; i < count; i++) |
56 lock (q2) | 71 lock (q2) |
57 q2.Enqueue(i); | 72 q2.Enqueue(i); |
58 }), | 73 }), |
59 AsyncPool.InvokeNewThread(() => { | 74 AsyncPool.InvokeNewThread(() => { |
60 for(int i = 0 ; i< count ;) | 75 for (var i = 0; i < count; i++) |
61 lock(q2) { | 76 lock (q2) |
62 if(q2.Count == 0) | 77 q2.Enqueue(i); |
63 continue; | 78 }), |
64 q2.Dequeue(); | 79 AsyncPool.InvokeNewThread(() => { |
65 i++; | 80 for (int i = 0; i < count ;) |
66 } | 81 lock (q2) { |
82 if (q2.Count == 0) | |
83 continue; | |
84 q2.Dequeue(); | |
85 i++; | |
86 } | |
67 | 87 |
68 }) | 88 }), |
69 } | 89 AsyncPool.InvokeNewThread(() => { |
70 ).Join(); | 90 for (int i = 0; i < count ;) |
91 lock (q2) { | |
92 if (q2.Count == 0) | |
93 continue; | |
94 q2.Dequeue(); | |
95 i++; | |
96 } | |
97 | |
98 }) | |
99 } | |
100 .Combine() | |
101 .Join(); | |
71 | 102 |
72 | 103 |
73 | 104 |
74 t2 = Environment.TickCount; | 105 t2 = Environment.TickCount; |
75 Console.WriteLine("LinkedList+Lock: {0} ms", t2 - t1); | 106 Console.WriteLine("Queue+Lock: {0} ms", t2 - t1); |
76 | 107 |
77 } | 108 } |
78 } | 109 } |
79 } | 110 } |