public SimpleLatencyBenchmarkResult Bench(int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var appender = new NLogTestTarget(false); var config = new LoggingConfiguration(); config.AddTarget(nameof(appender), appender); config.LoggingRules.Add(new LoggingRule(nameof(appender), LogLevel.Debug, appender)); NLog.LogManager.Configuration = config; NLog.LogManager.ReconfigExistingLoggers(); var logger = NLog.LogManager.GetLogger(nameof(appender)); var signal = appender.SetMessageCountTarget(totalMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; int[] counter = { 0 }; var warmingResult = SimpleLatencyBenchmark.Bench(() => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; counter[0] = 0; return(SimpleLatencyBenchmark.Bench(() => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), messageByProducer)); }); var result = SimpleLatencyBenchmark.RunBench(producingThreadCount, produce, signal); LogManager.Shutdown(); return(result); }
public SimpleLatencyBenchmarkResult Bench(int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var repository = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly()); var layout = new PatternLayout("%-4timestamp [%thread] %-5level %logger %ndc - %message%newline"); layout.ActivateOptions(); var appender = new Log4NetTestAppender(false); appender.ActivateOptions(); BasicConfigurator.Configure(repository, appender); var logger = log4net.LogManager.GetLogger(repository.Name, nameof(appender)); var signal = appender.SetMessageCountTarget(totalMessageCount + warmingMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; int[] counter = { 0 }; var warmingResult = SimpleLatencyBenchmark.Bench(() => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; counter[0] = 0; return(SimpleLatencyBenchmark.Bench(() => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), messageByProducer)); }); return(SimpleLatencyBenchmark.RunBench(producingThreadCount, produce, signal)); }
public SimpleLatencyBenchmarkResult Bench(int queueSize, int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var appender = new Tests.TestAppender(false); BasicConfigurator.Configure(new[] { appender }, queueSize, logEventPoolExhaustionStrategy: LogEventPoolExhaustionStrategy.WaitForLogEvent); var logger = LogManager.GetLogger(nameof(ZeroLog)); var signal = appender.SetMessageCountTarget(warmingMessageCount + totalMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; int[] counter = { 0 }; var warmingResult = SimpleLatencyBenchmark.Bench(() => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; counter[0] = 0; return(SimpleLatencyBenchmark.Bench(() => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), messageByProducer)); }); var result = SimpleLatencyBenchmark.RunBench(producingThreadCount, produce, signal); LogManager.Shutdown(); return(result); }
public List <HistogramBase> Bench(int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var layout = new PatternLayout("%-4timestamp [%thread] %-5level %logger %ndc - %message%newline"); layout.ActivateOptions(); var appender = new Log4NetTestAppender(false); appender.ActivateOptions(); BasicConfigurator.Configure(appender); var logger = log4net.LogManager.GetLogger(nameof(appender)); var signal = appender.SetMessageCountTarget(totalMessageCount + warmingMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; var warmingResult = SimpleLatencyBenchmark.Bench(i => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; return(SimpleLatencyBenchmark.Bench(i => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), messageByProducer)); }); var tasks = new List <Task <HistogramBase> >(); for (var i = 0; i < producingThreadCount; i++) { tasks.Add(Task.Factory.StartNew(produce, TaskCreationOptions.LongRunning)); } signal.Wait(TimeSpan.FromSeconds(30)); return(tasks.Select(x => x.Result).ToList()); }
public List <HistogramBase> Bench(int queueSize, int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var appender = new ZeroLog.Tests.TestAppender(false); BasicConfigurator.Configure(new[] { appender }, queueSize, logEventPoolExhaustionStrategy: LogEventPoolExhaustionStrategy.WaitForLogEvent); var logger = LogManager.GetLogger(nameof(ZeroLog)); var signal = appender.SetMessageCountTarget(warmingMessageCount + totalMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; var warmingResult = SimpleLatencyBenchmark.Bench(i => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; return(SimpleLatencyBenchmark.Bench(i => logger.InfoFormat("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), messageByProducer)); }); var tasks = new List <Task <HistogramBase> >(); for (var i = 0; i < producingThreadCount; i++) { tasks.Add(Task.Factory.StartNew(produce, TaskCreationOptions.LongRunning)); } signal.Wait(TimeSpan.FromSeconds(30)); LogManager.Shutdown(); return(tasks.Select(x => x.Result).ToList()); }
private static void LatencyMultiProducer(int threadCount, int warmupMessageCount, int messageCount, int queueSize) { var zeroLog = new ZeroLogMultiProducer().Bench(queueSize, warmupMessageCount, messageCount, threadCount); var nlogSync = new NLogSyncMultiProducer().Bench(warmupMessageCount, messageCount, threadCount); var nlogAsync = new NLogAsyncMultiProducer().Bench(queueSize, warmupMessageCount, messageCount, threadCount); var log4net = new Log4NetMultiProducer().Bench(warmupMessageCount, messageCount, threadCount); SimpleLatencyBenchmark.PrintSummary($"{threadCount} producers, {messageCount} total log events (queue size={queueSize}) - unit is *us*", ("ZeroLog", zeroLog), ("NLogSync", nlogSync), ("NLogAsync", nlogAsync), ("Log4net", log4net)); }
public List <HistogramBase> Bench(int queueSize, int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var appender = new NLogTestTarget(false); var asyncTarget = (new AsyncTargetWrapper(appender, queueSize, overflowAction: AsyncTargetWrapperOverflowAction.Block)); var config = new LoggingConfiguration(); config.AddTarget(nameof(asyncTarget), asyncTarget); config.LoggingRules.Add(new LoggingRule(nameof(asyncTarget), LogLevel.Debug, asyncTarget)); NLog.LogManager.Configuration = config; NLog.LogManager.ReconfigExistingLoggers(); var logger = NLog.LogManager.GetLogger(nameof(asyncTarget)); var signal = appender.SetMessageCountTarget(warmingMessageCount + totalMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; var warmingResult = SimpleLatencyBenchmark.Bench(i => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; return(SimpleLatencyBenchmark.Bench(i => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, i), messageByProducer)); }); var flusher = new Action(() => { while (!signal.IsSet) { NLog.LogManager.Flush(); } }); Task.Factory.StartNew(flusher, TaskCreationOptions.LongRunning); var tasks = new List <Task <HistogramBase> >(); for (var i = 0; i < producingThreadCount; i++) { tasks.Add(Task.Factory.StartNew(produce, TaskCreationOptions.LongRunning)); } signal.Wait(TimeSpan.FromSeconds(30)); LogManager.Shutdown(); return(tasks.Select(x => x.Result).ToList()); }
public SimpleLatencyBenchmarkResult Bench(int queueSize, int warmingMessageCount, int totalMessageCount, int producingThreadCount) { var appender = new NLogTestTarget(false); var asyncTarget = (new AsyncTargetWrapper(appender, queueSize, overflowAction: AsyncTargetWrapperOverflowAction.Block)); var config = new LoggingConfiguration(); config.AddTarget(nameof(asyncTarget), asyncTarget); config.LoggingRules.Add(new LoggingRule(nameof(asyncTarget), LogLevel.Debug, asyncTarget)); NLog.LogManager.Configuration = config; NLog.LogManager.ReconfigExistingLoggers(); var logger = NLog.LogManager.GetLogger(nameof(asyncTarget)); var signal = appender.SetMessageCountTarget(warmingMessageCount + totalMessageCount); var produce = new Func <HistogramBase>(() => { var warmingMessageByProducer = warmingMessageCount / producingThreadCount; int[] counter = { 0 }; var warmingResult = SimpleLatencyBenchmark.Bench(() => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), warmingMessageByProducer); var messageByProducer = totalMessageCount / producingThreadCount; counter[0] = 0; return(SimpleLatencyBenchmark.Bench(() => logger.Info("Hi {0} ! It's {1:HH:mm:ss}, and the message is #{2}", "dude", DateTime.UtcNow, counter[0]++), messageByProducer)); }); var flusher = new Action(() => { while (!signal.IsSet) { NLog.LogManager.Flush(); } }); Task.Factory.StartNew(flusher, TaskCreationOptions.LongRunning); var result = SimpleLatencyBenchmark.RunBench(producingThreadCount, produce, signal); LogManager.Shutdown(); return(result); }