public void Start() { _sharedBuffer = new RingBufferStream(); _writer = new InternalBigEndianWriter((b,off,c) => { _sharedBuffer.Insert(b, off, c); }); _reader = new InternalBigEndianReader(_sharedBuffer); }
public async Task GC_min_allocation_test() { Console.WriteLine("GC_min_allocation_test Starting..."); // await Task.Delay(3000); Console.WriteLine("Started"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); bool done = false; const int mod = 37; var producerBuffer = new byte[10]; var watch = Stopwatch.StartNew(); // long iterations = 1000000000000000000; long iterations = 100000000; var producerTask = Task.Run(async() => { for (var i = 0L; i < iterations; i += 10L) { producerBuffer[0] = (byte)(i % mod); producerBuffer[1] = (byte)((i + 1) % mod); producerBuffer[2] = (byte)((i + 2) % mod); producerBuffer[3] = (byte)((i + 3) % mod); producerBuffer[4] = (byte)((i + 4) % mod); producerBuffer[5] = (byte)((i + 5) % mod); producerBuffer[6] = (byte)((i + 6) % mod); producerBuffer[7] = (byte)((i + 7) % mod); producerBuffer[8] = (byte)((i + 8) % mod); producerBuffer[9] = (byte)((i + 9) % mod); await rbuffer.Insert(producerBuffer, 0, producerBuffer.Length); } done = true; }); var temp = new byte[199]; var consumerTask = Task.Run(async() => { int totalRead = 0; while (true) { // await Task.Delay(_rnd.Next(10)); // Console.WriteLine("will read..."); var read = rbuffer.Read(temp, 0, temp.Length); totalRead += read; if (read == 0) { continue; } // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (done && rbuffer.Position == rbuffer.Length) { break; } } Console.WriteLine("Done"); }); Task.WaitAll(producerTask, consumerTask); watch.Stop(); // Console.WriteLine("Checking consistency..."); Console.WriteLine("Completed in " + watch.Elapsed.TotalMilliseconds + "ms"); }
public async Task Fast_producer_slow_consumer() { Console.WriteLine("Fast_producer_slow_consumer"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); bool done = false; const int mod = 37; var producerTask = Task.Run(async() => { for (int i = 0; i < 1024 * 1000; i += 10) { var buffer = new [] { (byte)(i % mod), (byte)((i + 1) % mod), (byte)((i + 2) % mod), (byte)((i + 3) % mod), (byte)((i + 4) % mod), (byte)((i + 5) % mod), (byte)((i + 6) % mod), (byte)((i + 7) % mod), (byte)((i + 8) % mod), (byte)((i + 9) % mod), }; await rbuffer.Insert(buffer, 0, buffer.Length); } done = true; }); var consumed = new List <byte>(capacity: 1024 * 1000); var consumerTask = Task.Run(async() => { int totalRead = 0; while (true) { await Task.Delay(_rnd.Next(10)); // Console.WriteLine("will read..."); var temp = new byte[199]; var read = rbuffer.Read(temp, 0, temp.Length); totalRead += read; if (read == 0) { continue; } for (int i = 0; i < read; i++) { consumed.Add(temp[i]); } // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (done && rbuffer.Position == rbuffer.Length) { break; } } Console.WriteLine("Done"); }); Task.WaitAll(producerTask, consumerTask); Console.WriteLine("Checking consistency..."); for (int i = 0; i < consumed.Count; i++) { var isValid = consumed[i] == i % mod; isValid.Should().BeTrue(); } Console.WriteLine("Completed"); }
public async Task TestClient() { var inputStream = new RingBufferStream(100000, false); var outputStream = new RingBufferStream(100000, false); // The streams aren't readable until there is data, // so add something before constructing the stream readers. inputStream.WriteByte(0); outputStream.WriteByte(0); var inputWriter = new StreamWriter(inputStream); var outputReader = new StreamReader(outputStream); var client = new IrcClient(new StreamReader(inputStream), new StreamWriter(outputStream)); // Undo the hack inputStream.ReadByte(); outputStream.ReadByte(); client.EnableCtcpPingVersion() .EnablePingHandler() .EnableChannelTracker(); client.RateLimiter = new TokenBucketRateLimiter(20, 30); await client.Register("someone", "someone", "someone"); Assert.Equal("NICK someone", outputReader.ReadLine()); Assert.Equal("USER someone 8 * :someone", outputReader.ReadLine()); inputWriter.WriteLine(":example.com 001 someone :Welcome"); inputWriter.WriteLine(":example.com 002 someone :Host is fake"); inputWriter.WriteLine(":example.com 003 someone :Created sometime"); inputWriter.WriteLine(":example.com 004 someone :Nothing useful"); inputWriter.Flush(); await client.WaitReply(NumericalReplyCodes.RPL_WELCOME, 1000); Assert.Equal("someone", client.ClientId.Nickname); inputWriter.WriteLine(":example.com 375 someone :- Hello"); inputWriter.WriteLine(":example.com 372 someone :- blah blah blah"); inputWriter.WriteLine(":example.com 376 someone :End MOTD"); inputWriter.Flush(); await client.WaitReply(NumericalReplyCodes.RPL_ENDOFMOTD, 1000); await client.Join(new[] { "#test" }); Assert.StartsWith("JOIN #test", outputReader.ReadLine()); inputWriter.WriteLine(":[email protected] JOIN :#test"); inputWriter.Flush(); var message = await client.ReadMessage(); Assert.Equal("#test", message.TargetLower); await client.Privmsg("#test", "hello world!"); Assert.StartsWith("PRIVMSG #test :hello world!", outputReader.ReadLine()); inputWriter.WriteLine("@display-name=Fred :[email protected] PRIVMSG #test :hey"); inputWriter.Flush(); message = await client.ReadMessage(); Assert.Equal("Fred", message.Tags["display-name"]); Assert.Equal("~fred", message.Prefix.ClientId.User); Assert.Equal("PRIVMSG", message.Command); Assert.Equal("hey", message.TrailingParameter); inputWriter.WriteLine(":example.com PING :abc"); inputWriter.Flush(); await client.ProcessOnce(); Assert.Equal("PONG :abc", outputReader.ReadLine()); inputWriter.WriteLine(":[email protected] PRIVMSG someone :\u0001VERSION\u0001"); inputWriter.Flush(); await client.ProcessOnce(); Assert.StartsWith("NOTICE drone :\u0001VERSION ", outputReader.ReadLine()); inputWriter.WriteLine(":[email protected] PRIVMSG someone :\u0001PING abc\u0001"); inputWriter.Flush(); await client.ProcessOnce(); Assert.Equal("NOTICE drone :\u0001PING abc\u0001", outputReader.ReadLine()); }
public async Task Fast_producer_slow_consumer() { Console.WriteLine("Fast_producer_slow_consumer"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); bool done = false; const int mod = 37; var producerTask = Task.Run(async () => { for (int i = 0; i < 1024*1000; i += 10) { var buffer = new [] { (byte) (i%mod), (byte) ((i + 1) %mod), (byte) ((i + 2) %mod), (byte) ((i + 3) %mod), (byte) ((i + 4) %mod), (byte) ((i + 5) %mod), (byte) ((i + 6) %mod), (byte) ((i + 7) %mod), (byte) ((i + 8) %mod), (byte) ((i + 9) %mod), }; await rbuffer.Insert(buffer, 0, buffer.Length); } done = true; }); var consumed = new List<byte>(capacity: 1024 * 1000); var consumerTask = Task.Run(async () => { int totalRead = 0; while (true) { await Task.Delay(_rnd.Next(10)); // Console.WriteLine("will read..."); var temp = new byte[199]; var read = rbuffer.Read(temp, 0, temp.Length); totalRead += read; if (read == 0) continue; for (int i = 0; i < read; i++) { consumed.Add(temp[i]); } // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (done && rbuffer.Position == rbuffer.Length) { break; } } Console.WriteLine("Done"); }); Task.WaitAll(producerTask, consumerTask); Console.WriteLine("Checking consistency..."); for (int i = 0; i < consumed.Count; i++) { var isValid = consumed[i] == i % mod; isValid.Should().BeTrue(); } Console.WriteLine("Completed"); }
public async Task GC_min_allocation_test() { Console.WriteLine("GC_min_allocation_test Starting..."); // await Task.Delay(3000); Console.WriteLine("Started"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); bool done = false; const int mod = 37; var producerBuffer = new byte[10]; var watch = Stopwatch.StartNew(); // long iterations = 1000000000000000000; long iterations = 100000000; var producerTask = Task.Run(async () => { for (var i = 0L; i < iterations; i += 10L) { producerBuffer[0] = (byte) (i % mod); producerBuffer[1] = (byte) ((i + 1) % mod); producerBuffer[2] = (byte) ((i + 2) % mod); producerBuffer[3] = (byte) ((i + 3) % mod); producerBuffer[4] = (byte) ((i + 4) % mod); producerBuffer[5] = (byte) ((i + 5) % mod); producerBuffer[6] = (byte) ((i + 6) % mod); producerBuffer[7] = (byte) ((i + 7) % mod); producerBuffer[8] = (byte) ((i + 8) % mod); producerBuffer[9] = (byte) ((i + 9) % mod); await rbuffer.Insert(producerBuffer, 0, producerBuffer.Length); } done = true; }); var temp = new byte[199]; var consumerTask = Task.Run(async () => { int totalRead = 0; while (true) { // await Task.Delay(_rnd.Next(10)); // Console.WriteLine("will read..."); var read = rbuffer.Read(temp, 0, temp.Length); totalRead += read; if (read == 0) continue; // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (done && rbuffer.Position == rbuffer.Length) { break; } } Console.WriteLine("Done"); }); Task.WaitAll(producerTask, consumerTask); watch.Stop(); // Console.WriteLine("Checking consistency..."); Console.WriteLine("Completed in " + watch.Elapsed.TotalMilliseconds + "ms"); }
public async Task Variable_size_writes_slow_consumer() { Console.WriteLine("Variable_size_writes_slow_consumer"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); bool done = false; const int mod = 37; const int sizeOfSet = 1024*100; var producerTask = Task.Run(async () => { int stepAndBufferSize = 0; for (int i = 0; i < sizeOfSet; i += stepAndBufferSize) { var buffer = new[] { (byte) (i%mod), (byte) ((i + 1) %mod), (byte) ((i + 2) %mod), (byte) ((i + 3) %mod), (byte) ((i + 4) %mod), (byte) ((i + 5) %mod), (byte) ((i + 6) %mod), (byte) ((i + 7) %mod), (byte) ((i + 8) %mod), (byte) ((i + 9) %mod), (byte) ((i + 10) %mod), (byte) ((i + 11) %mod), (byte) ((i + 12) %mod), (byte) ((i + 13) %mod), (byte) ((i + 14) %mod), (byte) ((i + 15) %mod), (byte) ((i + 16) %mod), (byte) ((i + 17) %mod), (byte) ((i + 18) %mod), (byte) ((i + 19) %mod), (byte) ((i + 20) %mod), (byte) ((i + 21) %mod), (byte) ((i + 22) %mod), (byte) ((i + 23) %mod), (byte) ((i + 24) %mod), (byte) ((i + 25) %mod), (byte) ((i + 26) %mod), (byte) ((i + 27) %mod), (byte) ((i + 28) %mod), (byte) ((i + 29) %mod), }; stepAndBufferSize = _rnd.Next(buffer.Length); await rbuffer.Insert(buffer, 0, stepAndBufferSize); } done = true; }); var consumed = new List<byte>(capacity: sizeOfSet); var consumerTask = Task.Run(async () => { int totalRead = 0; while (true) { await Task.Delay(_rnd.Next(10)); // Console.WriteLine("will read..."); var temp = new byte[400]; var readSize = _rnd.Next(temp.Length - 1) + 1; var read = rbuffer.Read(temp, 0, readSize); totalRead += read; if (read == 0) continue; for (int i = 0; i < read; i++) { consumed.Add(temp[i]); } // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (done && rbuffer.Position == rbuffer.Length) { break; } } Console.WriteLine("Done"); }); Task.WaitAll(producerTask, consumerTask); Console.WriteLine("Checking consistency..."); for (int i = 0; i < consumed.Count; i++) { var isValid = consumed[i] == i % mod; isValid.Should().BeTrue(); } Console.WriteLine("Completed"); }
public async Task Insert_1_byte_by_1() { Console.WriteLine("Insert_1_byte_by_1"); var cancelationTokenSource = new CancellationTokenSource(); var rbuffer = new RingBufferStream(cancelationTokenSource.Token); int expectedLast = 0; for (int i = 0; i < 1024 * 100; i++) { await rbuffer.Insert(new[] { (byte)(i % 256) }, 0, 1); if (i % 99 == 0) { var temp = new byte[101]; var read = rbuffer.Read(temp, 0, temp.Length); Console.WriteLine("[Dump] read: " + read + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); if (i == 0) { read.Should().Be(1); temp[read - 1].Should().Be((byte)expectedLast); } else { read.Should().Be(99); temp[read - 1].Should().Be((byte)expectedLast); } expectedLast += 99; expectedLast %= 256; } } { var temp = new byte[101]; var read = rbuffer.Read(temp, 0, temp.Length); Console.WriteLine("[Final] read: " + read + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]"); } }