using BenchmarkDotNet.Attributes; using System.Threading.Channels; using VanDerHeijden.Logging; using VanDerHeijden.Logging.File; /// /// Meet de end-to-end throughput van BatchedLogger + FileLogWriter: /// hoe snel kunnen berichten via de channel worden aangeboden (Write), /// en hoe lang duurt het tot alles geflushed is (Dispose). /// /// Logger en writer worden per iteratie opnieuw aangemaakt via IterationSetup/Cleanup /// zodat elke meting met een frisse, niet-disposed instantie werkt. /// [MemoryDiagnoser] public class BatchedLoggerBenchmarks { private string logDirectory = null!; private string message = null!; private FileLogWriter fileWriter = null!; private BatchedLogger logger = null!; [Params(1_000, 10_000, 100_000)] public int MessageCount { get; set; } [GlobalSetup] public void GlobalSetup() { logDirectory = Path.Combine(Path.GetTempPath(), $"bench-batched-{Guid.NewGuid():N}"); Directory.CreateDirectory(logDirectory); message = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} [Information] Benchmark test message{Environment.NewLine}"; } [IterationSetup] public void IterationSetup() { fileWriter = new FileLogWriter(logDirectory); logger = new BatchedLogger( fileWriter, batchSize: 200, maxIdleMs: 500, fullMode: BoundedChannelFullMode.Wait); } [IterationCleanup] public void IterationCleanup() { // Dispose wacht tot de consumer alle berichten heeft geflushed naar schijf logger.Dispose(); } [GlobalCleanup] public void GlobalCleanup() { try { Directory.Delete(logDirectory, recursive: true); } catch { } } /// /// Meet de volledige pipeline: N berichten enqueuen + wachten tot alles naar schijf is. /// De Dispose() in IterationCleanup wacht tot de consumer klaar is, maar valt buiten de meting. /// [Benchmark(Description = "End-to-end (enqueue + flush)")] public void EndToEnd() { for (var i = 0; i < MessageCount; i++) logger.Write(message); } }