Mercurial > pub > ImplabNet
comparison MonoPlay/Program.cs @ 125:f803565868a4 v2
improved performance of promises
author | cin |
---|---|
date | Thu, 15 Jan 2015 12:09:20 +0300 |
parents | a336cb13c6a9 |
children | e9e7940c7d98 |
comparison
equal
deleted
inserted
replaced
124:a336cb13c6a9 | 125:f803565868a4 |
---|---|
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 AsyncQueue<int>(); | |
15 var q2 = new Queue<int>(); | |
16 | |
17 const int count = 10000000; | 14 const int count = 10000000; |
18 | 15 |
19 int res1 = 0, res2 = 0; | |
20 var t1 = Environment.TickCount; | 16 var t1 = Environment.TickCount; |
21 | 17 |
22 AsyncPool.RunThread( | 18 for (int i = 0; i < count; i++) { |
23 () => { | 19 var p = new Promise<int>(); |
24 for (var i = 0; i < count; i++) | |
25 q1.Enqueue(1); | |
26 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1); | |
27 }, | |
28 () => { | |
29 for (var i = 0; i < count; i++) | |
30 q1.Enqueue(2); | |
31 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1); | |
32 }, | |
33 () => { | |
34 int temp = 0; | |
35 int i = 0; | |
36 while (i < count) | |
37 if (q1.TryDequeue(out temp)) { | |
38 i++; | |
39 res1 += temp; | |
40 } | |
41 Console.WriteLine("done reader #1: {0} ms", Environment.TickCount - t1); | |
42 }, | |
43 () => { | |
44 int temp = 0; | |
45 int i = 0; | |
46 while (i < count) | |
47 if (q1.TryDequeue(out temp)) { | |
48 i++; | |
49 res2 += temp; | |
50 } | |
51 Console.WriteLine("done reader #2: {0} ms", Environment.TickCount - t1); | |
52 } | |
53 ) | |
54 .Bundle() | |
55 .Join(); | |
56 | 20 |
57 Console.WriteLine("done: {0} ms, summ#1: {1}, summ#2: {2}, total: {3}, count: {4}", Environment.TickCount - t1, res1, res2, res1 + res2, count*2); | 21 p.On(x => {}).On(x => {}); |
22 | |
23 p.Resolve(i); | |
24 | |
25 } | |
26 | |
27 | |
58 | 28 |
59 var t2 = Environment.TickCount; | 29 var t2 = Environment.TickCount; |
60 Console.WriteLine("MTQueue: {0} ms", t2 - t1); | 30 Console.WriteLine("done: {0} ms, {1:.00} Mb, {2} GC", t2 - t1, GC.GetTotalMemory(false) / (1024*1024), GC.CollectionCount(0) ); |
61 | |
62 t1 = Environment.TickCount; | |
63 | |
64 for (var i = 0; i < count * 2; i++) | |
65 q2.Enqueue(i); | |
66 | |
67 for (var i = 0; i < count * 2; i++) | |
68 q2.Dequeue(); | |
69 | |
70 t2 = Environment.TickCount; | |
71 Console.WriteLine("Queue: {0} ms", t2 - t1); | |
72 | |
73 q2 = new Queue<int>(); | |
74 | |
75 t1 = Environment.TickCount; | |
76 | |
77 | |
78 AsyncPool.RunThread( | |
79 () => { | |
80 for (var i = 0; i < count; i++) | |
81 lock (q2) | |
82 q2.Enqueue(i); | |
83 }, | |
84 () => { | |
85 for (var i = 0; i < count; i++) | |
86 lock (q2) | |
87 q2.Enqueue(i); | |
88 }, | |
89 () => { | |
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 for (int i = 0; i < count ;) | |
101 lock (q2) { | |
102 if (q2.Count == 0) | |
103 continue; | |
104 q2.Dequeue(); | |
105 i++; | |
106 } | |
107 | |
108 } | |
109 ) | |
110 .Bundle() | |
111 .Join(); | |
112 | |
113 | |
114 | |
115 t2 = Environment.TickCount; | |
116 Console.WriteLine("Queue+Lock: {0} ms", t2 - t1); | |
117 | 31 |
118 } | 32 } |
119 } | 33 } |
120 } | 34 } |