public void BigStream() { window_ = new WindowedStream(0x3ffff); outStream_ = new GZipOutputStream(window_); inStream_ = new GZipInputStream(window_); long target = 0x10000000; readTarget_ = writeTarget_ = target; Thread reader = new Thread(Reader); reader.Name = "Reader"; reader.Start(); Thread writer = new Thread(Writer); writer.Name = "Writer"; DateTime startTime = DateTime.Now; writer.Start(); writer.Join(); reader.Join(); DateTime endTime = DateTime.Now; TimeSpan span = endTime - startTime; Console.WriteLine("Time {0} processes {1} KB/Sec", span, (target / 1024) / span.TotalSeconds); }
//Performance tests hamper TDD efforts //[Test] //[Category("Zip")] //[Category("Long Running")] public void SingleLargeEntry() { window_ = new WindowedStream(0x10000); outStream_ = new ZipOutputStream(window_); inStream_ = new ZipInputStream(window_); long target = 0x10000000; readTarget_ = writeTarget_ = target; Thread reader = new Thread(Reader); reader.Name = "Reader"; Thread writer = new Thread(Writer); writer.Name = "Writer"; DateTime startTime = DateTime.Now; reader.Start(); writer.Start(); writer.Join(); reader.Join(); DateTime endTime = DateTime.Now; TimeSpan span = endTime - startTime; Console.WriteLine("Time {0} throughput {1} KB/Sec", span, (target / 1024.0) / span.TotalSeconds); }
public void Performance() { window_ = new WindowedStream(0x150000); outStream_ = new BZip2OutputStream(window_, 1); const long Target = 0x10000000; readTarget_ = writeTarget_ = Target; Thread reader = new Thread(Reader); reader.Name = "Reader"; Thread writer = new Thread(Writer); writer.Name = "Writer"; DateTime startTime = DateTime.Now; writer.Start(); inStream_ = new BZip2InputStream(window_); reader.Start(); Assert.IsTrue(writer.Join(TimeSpan.FromMinutes(5.0D))); Assert.IsTrue(reader.Join(TimeSpan.FromMinutes(5.0D))); DateTime endTime = DateTime.Now; TimeSpan span = endTime - startTime; Console.WriteLine("Time {0} throughput {1} KB/Sec", span, (Target / 1024) / span.TotalSeconds); }
public static void TestReadWrite(int size, Func <Stream, Stream> input, Func <Stream, Stream> output, Action <Stream> outputClose = null) { var cts = new CancellationTokenSource(TimeSpan.FromMinutes(1)); var window = new WindowedStream(size, cts.Token); var readerState = new PerfWorkerState() { bytesLeft = size, token = cts.Token, baseStream = window, streamCtr = input, }; var writerState = new PerfWorkerState() { bytesLeft = size, token = cts.Token, baseStream = window, streamCtr = output, streamCls = outputClose }; var reader = new Thread(stateObject => { var state = (PerfWorkerState)stateObject; try { // Run output stream constructor state.InitStream(); // Main read loop ReadTargetBytes(ref state); if (!state.token.IsCancellationRequested) { Assert.IsFalse(state.baseStream.CanRead, "Base Stream should be closed"); // This shouldnt read any data but should read the footer var buffer = new byte[1]; int readBytes = state.stream.Read(buffer, 0, 1); Assert.LessOrEqual(readBytes, 0, "Stream should be empty"); } // Dispose of the input stream state.stream.Close(); } catch (Exception x) { state.exception = x; } }); Thread writer = new Thread(stateObject => { var state = (PerfWorkerState)stateObject; try { // Run input stream constructor state.InitStream(); // Main write loop WriteTargetBytes(ref state); state.DeinitStream(); // Dispose of the input stream state.stream.Close(); } catch (Exception x) { state.exception = x; } }); var sw = Stopwatch.StartNew(); writer.Name = "Writer"; writer.Start(writerState); // Give the writer thread a couple of seconds to write headers Thread.Sleep(TimeSpan.FromSeconds(3)); reader.Name = "Reader"; reader.Start(readerState); bool writerJoined = false, readerJoined = false; const int timeout = 100; while (!writerJoined && !readerJoined) { writerJoined = writer.Join(timeout); if (writerJoined && writerState.exception != null) { ExceptionDispatchInfo.Capture(writerState.exception).Throw(); } readerJoined = reader.Join(timeout); if (readerJoined && readerState.exception != null) { ExceptionDispatchInfo.Capture(readerState.exception).Throw(); } if (cts.IsCancellationRequested) { break; } } //Assert.IsTrue(writerJoined, "Timed out waiting for reader thread to join"); //Assert.IsTrue(readerJoined, "Timed out waiting for writer thread to join"); Assert.IsFalse(cts.IsCancellationRequested, "Threads were cancelled before completing execution"); var elapsed = sw.Elapsed; var testSize = size / ByteToMB; Console.WriteLine($"Time {elapsed:mm\\:ss\\.fff} throughput {testSize / elapsed.TotalSeconds:f2} MB/s (using test size: {testSize:f2} MB)"); }