Mercurial > pub > ImplabNet
comparison Implab.Test/AsyncTests.cs @ 233:d6fe09f5592c v2
Improved AsyncQueue
Removed ImplabFx
author | cin |
---|---|
date | Wed, 04 Oct 2017 15:44:47 +0300 |
parents | 8200ab154c8a |
children |
comparison
equal
deleted
inserted
replaced
229:5f7a3e1d32b9 | 233:d6fe09f5592c |
---|---|
220 pool.Dispose(); | 220 pool.Dispose(); |
221 } | 221 } |
222 | 222 |
223 [TestMethod] | 223 [TestMethod] |
224 public void MTQueueTest() { | 224 public void MTQueueTest() { |
225 var queue = new MTQueue<int>(); | 225 var queue = new SimpleAsyncQueue<int>(); |
226 int res; | 226 int res; |
227 | 227 |
228 queue.Enqueue(10); | 228 queue.Enqueue(10); |
229 Assert.IsTrue(queue.TryDequeue(out res)); | 229 Assert.IsTrue(queue.TryDequeue(out res)); |
230 Assert.AreEqual(10, res); | 230 Assert.AreEqual(10, res); |
231 Assert.IsFalse(queue.TryDequeue(out res)); | 231 Assert.IsFalse(queue.TryDequeue(out res)); |
232 | 232 |
240 | 240 |
241 int writers = 0; | 241 int writers = 0; |
242 int readers = 0; | 242 int readers = 0; |
243 var stop = new ManualResetEvent(false); | 243 var stop = new ManualResetEvent(false); |
244 int total = 0; | 244 int total = 0; |
245 | 245 var ticks = Environment.TickCount; |
246 const int itemsPerWriter = 10000; | 246 |
247 const int itemsPerWriter = 1000000; | |
247 const int writersCount = 10; | 248 const int writersCount = 10; |
248 | 249 |
249 for (int i = 0; i < writersCount; i++) { | 250 for (int i = 0; i < writersCount; i++) { |
250 Interlocked.Increment(ref writers); | 251 Interlocked.Increment(ref writers); |
251 AsyncPool | 252 AsyncPool |
276 }, PromiseEventType.All); | 277 }, PromiseEventType.All); |
277 } | 278 } |
278 | 279 |
279 stop.WaitOne(); | 280 stop.WaitOne(); |
280 | 281 |
281 Assert.AreEqual(100000, total); | 282 Console.WriteLine("{0} in {1}ms", total, Environment.TickCount - ticks); |
283 | |
284 Assert.AreEqual(itemsPerWriter * writersCount, total); | |
282 } | 285 } |
283 | 286 |
284 [TestMethod] | 287 [TestMethod] |
285 public void AsyncQueueTest() { | 288 public void AsyncQueueTest() { |
286 var queue = new AsyncQueue<int>(); | 289 var queue = new AsyncQueue<int>(); |
507 | 510 |
508 [TestMethod] | 511 [TestMethod] |
509 public void AsyncQueueDrainTest() { | 512 public void AsyncQueueDrainTest() { |
510 var queue = new AsyncQueue<int>(); | 513 var queue = new AsyncQueue<int>(); |
511 | 514 |
512 const int wBatch = 11; | 515 const int wBatch = 32; |
513 const int wCount = 200000; | 516 const int wCount = 200000; |
514 const int total = wBatch * wCount * 3; | 517 const int total = wBatch * wCount * 3; |
515 const int summ = wBatch * wCount * 3; | 518 const int summ = wBatch * wCount * 3; |
516 | 519 |
517 int r1 = 0, r2 = 0; | 520 int r1 = 0, r2 = 0; |
518 const int rBatch = 11; | |
519 int read = 0; | 521 int read = 0; |
520 | 522 |
521 var t1 = Environment.TickCount; | 523 var t1 = Environment.TickCount; |
522 | 524 |
523 AsyncPool.RunThread( | 525 AsyncPool.RunThread( |
529 for(int i =0; i < wCount; i++) | 531 for(int i =0; i < wCount; i++) |
530 queue.EnqueueRange(buffer,0,wBatch); | 532 queue.EnqueueRange(buffer,0,wBatch); |
531 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1); | 533 Console.WriteLine("done writer #1: {0} ms", Environment.TickCount - t1); |
532 }, | 534 }, |
533 () => { | 535 () => { |
534 for(int i =0; i < wCount * wBatch; i++) | 536 var buffer = new int[wBatch]; |
535 queue.Enqueue(1); | 537 for (int i = 0; i < wBatch; i++) |
538 buffer[i] = 1; | |
539 | |
540 for (int i = 0; i < wCount; i++) | |
541 queue.EnqueueRange(buffer, 0, wBatch); | |
536 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1); | 542 Console.WriteLine("done writer #2: {0} ms", Environment.TickCount - t1); |
537 }, | 543 }, |
538 () => { | 544 () => { |
539 var buffer = new int[wBatch]; | 545 var buffer = new int[wBatch]; |
540 for(int i = 0; i<wBatch; i++) | 546 for(int i = 0; i<wBatch; i++) |
570 | 576 |
571 Console.WriteLine("done reader #1: {0} ms, {1} items", Environment.TickCount - t1, count); | 577 Console.WriteLine("done reader #1: {0} ms, {1} items", Environment.TickCount - t1, count); |
572 },*/ | 578 },*/ |
573 () => { | 579 () => { |
574 var count = 0; | 580 var count = 0; |
575 while(read < total) { | 581 int emptyDrains = 0; |
582 | |
583 while (read < total) { | |
576 var buffer = queue.Drain(); | 584 var buffer = queue.Drain(); |
577 for(int i=0; i< buffer.Length; i++) | 585 if (buffer.Count == 0) |
586 emptyDrains++; | |
587 for(int i=0; i< buffer.Count; i++) | |
578 r1 += buffer[i]; | 588 r1 += buffer[i]; |
579 Interlocked.Add(ref read, buffer.Length); | 589 Interlocked.Add(ref read, buffer.Count); |
580 count += buffer.Length; | 590 count += buffer.Count; |
581 } | 591 } |
582 Console.WriteLine("done reader #1: {0} ms, {1} items", Environment.TickCount - t1, count); | 592 Console.WriteLine("done reader #1: {0} ms, {1} items, empty: {2}", Environment.TickCount - t1, count, emptyDrains); |
583 }, | 593 }, |
584 () => { | 594 () => { |
585 var count = 0; | 595 var count = 0; |
586 while(read < total) { | 596 int emptyDrains = 0; |
597 | |
598 while (read < total) { | |
587 var buffer = queue.Drain(); | 599 var buffer = queue.Drain(); |
588 for(int i=0; i< buffer.Length; i++) | 600 if (buffer.Count == 0) |
601 emptyDrains++; | |
602 | |
603 for (int i=0; i< buffer.Count; i++) | |
589 r2 += buffer[i]; | 604 r2 += buffer[i]; |
590 Interlocked.Add(ref read, buffer.Length); | 605 Interlocked.Add(ref read, buffer.Count); |
591 count += buffer.Length; | 606 count += buffer.Count; |
592 } | 607 } |
593 Console.WriteLine("done reader #2: {0} ms, {1} items", Environment.TickCount - t1, count); | 608 Console.WriteLine("done reader #2: {0} ms, {1} items, empty: {2}", Environment.TickCount - t1, count, emptyDrains); |
594 } | 609 } |
595 ) | 610 ) |
596 .PromiseAll() | 611 .PromiseAll() |
597 .Join(); | 612 .Join(); |
598 | 613 |