You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2023/12/21 04:59:26 UTC

(logging-log4cxx) 01/01: Improve benchmark test descriptions and simplify code

This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch cleanup_benchmark
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 1da38a0e71cfdffac9bc16450fec29884d1e187f
Author: Stephen Webb <sw...@gmail.com>
AuthorDate: Thu Dec 21 15:58:46 2023 +1100

    Improve benchmark test descriptions and simplify code
---
 src/test/cpp/benchmark/benchmark.cpp | 120 +++++++++++++++--------------------
 1 file changed, 52 insertions(+), 68 deletions(-)

diff --git a/src/test/cpp/benchmark/benchmark.cpp b/src/test/cpp/benchmark/benchmark.cpp
index 132c5ea6..d2cf66f2 100644
--- a/src/test/cpp/benchmark/benchmark.cpp
+++ b/src/test/cpp/benchmark/benchmark.cpp
@@ -27,6 +27,10 @@ public:
 
 	NullWriterAppender() {}
 
+	NullWriterAppender(const LayoutPtr& layout)
+		: AppenderSkeleton(layout)
+	{}
+
 	void close() override {}
 
 	bool requiresLayout() const override
@@ -51,14 +55,6 @@ public:
 
 IMPLEMENT_LOG4CXX_OBJECT(NullWriterAppender)
 
-#if defined(LOG4CXX_VERSION_MINOR) && (0 < LOG4CXX_VERSION_MAJOR || 11 < LOG4CXX_VERSION_MINOR)
-LOG4CXX_PTR_DEF(NullWriterAppender);
-#else
-#define LOG4CXX_HAS_FMT 0
-template class log4cxx::helpers::ObjectPtrT<NullWriterAppender>;
-typedef log4cxx::helpers::ObjectPtrT<NullWriterAppender> NullWriterAppenderPtr;
-#endif
-
 class benchmarker : public ::benchmark::Fixture
 {
 public:
@@ -71,12 +67,8 @@ public:
 		m_logger->setAdditivity(false);
 		m_logger->setLevel(Level::getInfo());
 
-		PatternLayoutPtr pattern(new PatternLayout);
-		pattern->setConversionPattern(LOG4CXX_STR("%m%n"));
-
-		NullWriterAppenderPtr nullWriter(new NullWriterAppender);
+		auto nullWriter = std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
 		nullWriter->setName(LOG4CXX_STR("NullWriterAppender"));
-		nullWriter->setLayout(pattern);
 
 		m_logger->addAppender(nullWriter);
 	}
@@ -119,7 +111,7 @@ BENCHMARK_DEFINE_F(benchmarker, logDisabledTrace)(benchmark::State& state)
 	m_logger->setLevel(Level::getDebug());
 	for (auto _ : state)
 	{
-		LOG4CXX_TRACE( m_logger, LOG4CXX_STR("This is a static string to see what happens"));
+		LOG4CXX_TRACE( m_logger, LOG4CXX_STR("Hello: static string message"));
 	}
 }
 BENCHMARK_REGISTER_F(benchmarker, logDisabledTrace)->Name("Testing disabled logging request")->MinWarmUpTime(benchmarker::warmUpSeconds());
@@ -130,111 +122,103 @@ BENCHMARK_DEFINE_F(benchmarker, logStaticString)(benchmark::State& state)
 	m_logger->setLevel(Level::getInfo());
 	for (auto _ : state)
 	{
-		LOG4CXX_INFO( m_logger, LOG4CXX_STR("This is a static string to see what happens"));
+		LOG4CXX_INFO( m_logger, LOG4CXX_STR("Hello: static string message"));
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logStaticString)->Name("Logging static string");
+BENCHMARK_REGISTER_F(benchmarker, logStaticString)->Name("Logging string using MessageBuffer, pattern: %m%n");
 
-#if LOG4CXX_USING_STD_FORMAT || LOG4CXX_HAS_FMT
-BENCHMARK_DEFINE_F(benchmarker, logStaticStringFMT)(benchmark::State& state)
+BENCHMARK_DEFINE_F(benchmarker, logIntValueMessageBuffer)(benchmark::State& state)
 {
+	int x = 0;
 	for (auto _ : state)
 	{
-		LOG4CXX_INFO_FMT(m_logger, "This is a static string to see what happens", 0);
+		LOG4CXX_INFO( m_logger, "Hello: message number " << ++x);
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logStaticStringFMT)->Name("Logging static string with FMT");
+BENCHMARK_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Logging int value using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Logging int value using MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
 
-BENCHMARK_DEFINE_F(benchmarker, logIntValueFMT)(benchmark::State& state)
+BENCHMARK_DEFINE_F(benchmarker, logIntPlusFloatMessageBuffer)(benchmark::State& state)
 {
 	int x = 0;
 	for (auto _ : state)
 	{
-		LOG4CXX_INFO_FMT( m_logger, "Hello: msg number {}", ++x);
+		auto f = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
+		LOG4CXX_INFO( m_logger, "Hello: message number " << ++x
+			<< " pseudo-random float " << std::setprecision(3) << std::fixed << f);
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Logging int value with FMT");
-BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Logging int value with FMT")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatMessageBuffer)->Name("Logging int+float using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatMessageBuffer)->Name("Logging int+float using MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
 
-BENCHMARK_DEFINE_F(benchmarker, logIntPlusFloatValueFMT)(benchmark::State& state)
+template <class ...Args>
+void logWithConversionPattern(benchmark::State& state, Args&&... args)
 {
+    auto args_tuple = std::make_tuple(std::move(args)...);
+	LogString conversionPattern = std::get<0>(args_tuple);
+
+	auto pattern = std::make_shared<PatternLayout>( conversionPattern );
+	auto logger = Logger::getLogger( LOG4CXX_STR("bench_logger") );
+	logger->getAppender(LOG4CXX_STR("NullWriterAppender"))->setLayout(pattern);
+
 	int x = 0;
 	for (auto _ : state)
 	{
-		auto f = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
-		LOG4CXX_INFO_FMT( m_logger, "Hello: msg number {} pseudo-random float {:.3f}", ++x, f);
+		LOG4CXX_INFO( logger, LOG4CXX_STR("Hello: msg number ") << ++x);
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Logging int+float with FMT");
-BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Logging int+float with FMT")->Threads(benchmarker::threadCount());
-#endif
+BENCHMARK_CAPTURE(logWithConversionPattern, DateMessage, LOG4CXX_STR("[%d] %m%n"))->Name("Logging int value using MessageBuffer, pattern: [%d] %m%n");
+BENCHMARK_CAPTURE(logWithConversionPattern, DateClassLevelMessage, LOG4CXX_STR("[%d] [%c] [%p] %m%n"))->Name("Logging int value using MessageBuffer, pattern: [%d] [%c] [%p] %m%n");
 
-BENCHMARK_DEFINE_F(benchmarker, logIntValueStream)(benchmark::State& state)
+#if  LOG4CXX_USING_STD_FORMAT || LOG4CXX_HAS_FMT
+BENCHMARK_DEFINE_F(benchmarker, logStaticStringFMT)(benchmark::State& state)
 {
-	int x = 0;
 	for (auto _ : state)
 	{
-		LOG4CXX_INFO( m_logger, "Hello: msg number " << ++x);
+		LOG4CXX_INFO_FMT(m_logger, "This is a static string to see what happens", 0);
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logIntValueStream)->Name("Logging int value with std::ostream");
-BENCHMARK_REGISTER_F(benchmarker, logIntValueStream)->Name("Logging int value with std::ostream")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logStaticStringFMT)->Name("Logging static string using FMT, pattern: %m%n");
 
-BENCHMARK_DEFINE_F(benchmarker, logIntPlusFloatStream)(benchmark::State& state)
+BENCHMARK_DEFINE_F(benchmarker, logIntValueFMT)(benchmark::State& state)
 {
 	int x = 0;
 	for (auto _ : state)
 	{
-		auto f = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
-		LOG4CXX_INFO( m_logger, "Hello: msg number " << ++x
-			<< " pseudo-random float " << std::setprecision(3) << std::fixed << f);
+		LOG4CXX_INFO_FMT(m_logger, "Hello: msg number {}", ++x);
 	}
 }
-BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatStream)->Name("Logging int+float with std::ostream");
-BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatStream)->Name("Logging int+float with std::ostream")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Logging int value using FMT, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Logging int value using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
 
-template <class ...Args>
-void logWithConversionPattern(benchmark::State& state, Args&&... args)
+BENCHMARK_DEFINE_F(benchmarker, logIntPlusFloatValueFMT)(benchmark::State& state)
 {
-    auto args_tuple = std::make_tuple(std::move(args)...);
-	LogString conversionPattern = std::get<0>(args_tuple);
-
-	PatternLayoutPtr pattern(new PatternLayout);
-	pattern->setConversionPattern( conversionPattern );
-	auto logger = Logger::getLogger( LOG4CXX_STR("bench_logger") );
-	logger->getAppender(LOG4CXX_STR("NullWriterAppender"))->setLayout(pattern);
-
 	int x = 0;
 	for (auto _ : state)
 	{
-		LOG4CXX_INFO( logger, LOG4CXX_STR("Hello m_logger: msg number ") << ++x);
+		auto f = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
+		LOG4CXX_INFO_FMT(m_logger, "Hello: msg number {} pseudo-random float {:.3f}", ++x, f);
 	}
 }
-BENCHMARK_CAPTURE(logWithConversionPattern, NoFormat, LOG4CXX_STR("%m%n"))->Name("NoFormat pattern: %m%n");
-BENCHMARK_CAPTURE(logWithConversionPattern, DateOnly, LOG4CXX_STR("[%d] %m%n"))->Name("DateOnly pattern: [%d] %m%n");
-BENCHMARK_CAPTURE(logWithConversionPattern, DateClassLevel, LOG4CXX_STR("[%d] [%c] [%p] %m%n"))->Name("DateClassLevel pattern: [%d] [%c] [%p] %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Logging int+float using FMT, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Logging int+float using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
+#endif
 
 static void SetAsyncAppender(const benchmark::State& state)
 {
-	LoggerPtr logger = Logger::getLogger( LOG4CXX_STR("bench_logger") );
+	auto logger = Logger::getLogger(LOG4CXX_STR("bench_logger"));
 	logger->removeAllAppenders();
-	logger->setAdditivity( false );
-	logger->setLevel( Level::getInfo() );
-
-	PatternLayoutPtr pattern(new PatternLayout);
-	pattern->setConversionPattern(LOG4CXX_STR("%m%n"));
+	logger->setAdditivity(false);
+	logger->setLevel(Level::getInfo());
 
-	NullWriterAppenderPtr nullWriter(new NullWriterAppender);
-	nullWriter->setLayout( pattern );
-	AsyncAppenderPtr asyncAppender = AsyncAppenderPtr(new AsyncAppender());
+	auto nullWriter = std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
+	auto asyncAppender = std::make_shared<AsyncAppender>();
 	asyncAppender->addAppender(nullWriter);
 	asyncAppender->setBufferSize(5);
-	helpers::Pool p;
-	asyncAppender->activateOptions(p);
 	logger->addAppender(asyncAppender);
 }
-BENCHMARK_REGISTER_F(benchmarker, logIntValueStream)->Name("Logging int value with std::ostream to AsyncAppender")->Setup(SetAsyncAppender);
-BENCHMARK_REGISTER_F(benchmarker, logIntValueStream)->Name("Logging int value with std::ostream to AsyncAppender")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Async, int value using MessageBuffer, pattern: %m%n")->Setup(SetAsyncAppender);
+BENCHMARK_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Async, int value using MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_MAIN();