public void testCapacityEnforced() { PriorityChannel channel = new PriorityChannel(3); Assert.IsTrue(channel.Send(new StringMessage("test1"), TimeSpan.Zero)); Assert.IsTrue(channel.Send(new StringMessage("test2"), TimeSpan.Zero)); Assert.IsTrue(channel.Send(new StringMessage("test3"), TimeSpan.Zero)); Assert.IsFalse(channel.Send(new StringMessage("test4"), TimeSpan.Zero)); channel.Receive(TimeSpan.Zero); Assert.IsTrue(channel.Send(new StringMessage("test5"))); }
public void testNullPriorityIsConsideredNormal() { PriorityChannel channel = new PriorityChannel(5); IMessage highPriority = CreatePriorityMessage(MessagePriority.HIGH); IMessage lowPriority = CreatePriorityMessage(MessagePriority.LOW); IMessage nullPriority = new StringMessage("test-NULL"); channel.Send(lowPriority); channel.Send(highPriority); channel.Send(nullPriority); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-HIGH")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-NULL")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-LOW")); }
public void PriorityChannelBenchmarkReadFirst() { var count = 100_000_000; var pc = new PriorityChannel <long>(); var rt = Task.Run(() => { using (Benchmark.Run("Read", count, true)) { var c = 0; while (c < count) { pc.TryTake(out var i, out var isPriority); //if (i >> 3 == 0 && !isPriority) //{ // Assert.Fail("i >> 8 == 0 && !isPriority"); //} c++; } } }); Thread.Sleep(100); var wt = Task.Run(() => { using (Benchmark.Run("Write", count, true)) { for (var i = 0; i < count; i++) { pc.TryAdd(i); //, i >> 3 == 0); } } }); rt.Wait(); wt.Wait(); Benchmark.Dump(); }
public void testCustomComparator() { PriorityChannel channel = new PriorityChannel(5, new StringPayloadComparator()); IMessage messageA = new StringMessage("A"); IMessage messageB = new StringMessage("B"); IMessage messageC = new StringMessage("C"); IMessage messageD = new StringMessage("D"); IMessage messageE = new StringMessage("E"); channel.Send(messageC); channel.Send(messageA); channel.Send(messageE); channel.Send(messageD); channel.Send(messageB); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("A")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("B")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("C")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("D")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("E")); }
public void testDefaultComparator() { PriorityChannel channel = new PriorityChannel(5); IMessage priority1 = CreatePriorityMessage(MessagePriority.HIGHEST); IMessage priority2 = CreatePriorityMessage(MessagePriority.HIGH); IMessage priority3 = CreatePriorityMessage(MessagePriority.NORMAL); IMessage priority4 = CreatePriorityMessage(MessagePriority.LOW); IMessage priority5 = CreatePriorityMessage(MessagePriority.LOWEST); channel.Send(priority4); channel.Send(priority3); channel.Send(priority5); channel.Send(priority1); channel.Send(priority2); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-HIGHEST")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-HIGH")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-NORMAL")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-LOW")); Assert.That(channel.Receive(TimeSpan.Zero).Payload, Is.EqualTo("test-LOWEST")); }
public void PriorityChannelBenchmarkWriteThenReadNoWait() { var count = 200_000_000; var pc = new PriorityChannel <ushort>(); var wt = Task.Run(() => { using (Benchmark.Run("Write", count, true)) { for (var i = 0; i < count; i++) { pc.TryAdd((ushort)(i % ushort.MaxValue)); //, i >> 3 == 0); } } }); wt.Wait(); var rt = Task.Run(() => { using (Benchmark.Run("Read", count, true)) { var c = 0; while (c < count) { pc.TryTake(out var i, out var isPriority); //if (i >> 3 == 0 && !isPriority) //{ // Assert.Fail("i >> 8 == 0 && !isPriority"); //} c++; } } }); rt.Wait(); Benchmark.Dump(); }
public void PriorityChannelBenchmarkSlowWriterTryThenBlock() { var count = 1_000_000; var cts = new CancellationTokenSource(); var pc = new PriorityChannel <int>(cts.Token); var wt = Task.Run(() => { using (Benchmark.Run("Write", count, true)) { for (var i = 0; i < count; i++) { var priority = i % 2 == 0; pc.TryAdd(i, priority); if (i % 10 == 0) { if (!Thread.Yield()) { Thread.Sleep(0); } } else { Thread.SpinWait(10); } } } }); var rt = Task.Run(() => { using (Benchmark.Run("Read", count, true)) { var c = 0; var spinner = new SpinWait(); while (c < count) { if (!pc.TryTake(out var i, out var isPriority)) { if (!pc.TryTake(out i, out isPriority)) { // still no new notifications, retry toggle after some wait spinner.SpinOnce(); if (spinner.NextSpinWillYield) { spinner.Reset(); if (!Thread.Yield()) { Thread.Sleep(0); } } continue; } } //if (i >> 3 == 0 && !isPriority) //{ // Assert.Fail("i >> 8 == 0 && !isPriority"); //} c++; } } }); rt.Wait(); wt.Wait(); Benchmark.Dump(); }