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

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

commit 316c998b0a3c69a5e9bf944d51bd1dc161710f8f
Author: Stephen Webb <[email protected]>
AuthorDate: Wed Feb 14 15:48:51 2024 +1100

    Improve benchmark correctness by avoiding side effects
---
 src/test/cpp/benchmark/benchmark.cpp | 118 ++++++++++++++++++++++-------------
 1 file changed, 74 insertions(+), 44 deletions(-)

diff --git a/src/test/cpp/benchmark/benchmark.cpp 
b/src/test/cpp/benchmark/benchmark.cpp
index 0160dc91..75e53204 100644
--- a/src/test/cpp/benchmark/benchmark.cpp
+++ b/src/test/cpp/benchmark/benchmark.cpp
@@ -1,4 +1,5 @@
 #include <log4cxx/logger.h>
+#include <log4cxx/logmanager.h>
 #include <log4cxx/patternlayout.h>
 #include <log4cxx/appenderskeleton.h>
 #include <log4cxx/helpers/optionconverter.h>
@@ -53,37 +54,21 @@ public:
        }
 };
 
+void disableThousandSeparatorsInJSON()
+{
+       std::setlocale(LC_ALL, "C"); /* Set locale for C functions */
+       std::locale::global(std::locale("C")); /* set locale for C++ functions 
*/
+}
+
 IMPLEMENT_LOG4CXX_OBJECT(NullWriterAppender)
 
 class benchmarker : public ::benchmark::Fixture
 {
-public:
-       LoggerPtr m_logger;
-       void SetupLogger()
-       {
-               m_logger = Logger::getLogger(LOG4CXX_STR("bench_logger"));
-
-               m_logger->removeAllAppenders();
-               m_logger->setAdditivity(false);
-               m_logger->setLevel(Level::getInfo());
-
-               auto nullWriter = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
-               nullWriter->setName(LOG4CXX_STR("NullWriterAppender"));
-
-               m_logger->addAppender(nullWriter);
-       }
-
-       void SetUp(const ::benchmark::State& state)
-       {
-               std::setlocale( LC_ALL, "C" ); /* Set locale for C functions */
-               std::locale::global(std::locale("C")); /* set locale for C++ 
functions */
-               SetupLogger();
-       }
-
-       void TearDown(const ::benchmark::State& state)
-       {
-       }
+public: // Attributes
+       LoggerPtr m_logger = getLogger();
+       LoggerPtr m_asyncLogger = getAsyncLogger();
 
+public: // Class methods
        static int threadCount()
        {
                auto threadCount = helpers::StringHelper::toInt
@@ -104,6 +89,60 @@ public:
                return milliseconds / 1000;
        }
 
+       static void setDefaultAppender()
+       {
+               auto r = LogManager::getLoggerRepository();
+               r->ensureIsConfigured([r]()
+                       {
+                       disableThousandSeparatorsInJSON();
+                       auto nullWriter = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
+                       nullWriter->setName(LOG4CXX_STR("NullWriterAppender"));
+                       r->getRootLogger()->addAppender(nullWriter);
+                       });
+       }
+
+       static LoggerPtr getLogger(const LogString& pattern = LogString())
+       {
+               LoggerPtr result;
+               setDefaultAppender();
+               auto r = LogManager::getLoggerRepository();
+               if (pattern.empty())
+                       result = r->getLogger(LOG4CXX_STR("benchmark.fixture"));
+               else if (r->exists(LOG4CXX_STR("benchmark.fixture.") + pattern))
+                       result = r->getLogger(LOG4CXX_STR("benchmark.fixture.") 
+ pattern);
+               else
+               {
+                       result = r->getLogger(LOG4CXX_STR("benchmark.fixture.") 
+ pattern);
+                       result->setAdditivity(false);
+                       result->setLevel(Level::getInfo());
+                       auto nullWriter = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(pattern));
+                       nullWriter->setName(LOG4CXX_STR("NullWriterAppender.") 
+ pattern);
+                       result->addAppender(nullWriter);
+               }
+               return result;
+       }
+
+       static LoggerPtr getAsyncLogger()
+       {
+               LoggerPtr result;
+               setDefaultAppender();
+               auto r = LogManager::getLoggerRepository();
+               LogString name = LOG4CXX_STR("benchmark.fixture.async");
+               if (r->exists(name))
+                       result = r->getLogger(name);
+               else
+               {
+                       auto nullWriter = 
r->getRootLogger()->getAppender(LOG4CXX_STR("NullWriterAppender"));
+                       auto asyncAppender = std::make_shared<AsyncAppender>();
+                       asyncAppender->addAppender(nullWriter);
+                       asyncAppender->setBufferSize(5);
+                       result = r->getLogger(name);
+                       result->setAdditivity(false);
+                       result->setLevel(Level::getInfo());
+                       result->addAppender(asyncAppender);
+               }
+               return result;
+       }
 };
 
 BENCHMARK_DEFINE_F(benchmarker, logDisabledTrace)(benchmark::State& state)
@@ -168,11 +207,7 @@ 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);
-
+       auto logger = benchmarker::getLogger(conversionPattern);
        int x = 0;
        for (auto _ : state)
        {
@@ -217,21 +252,16 @@ BENCHMARK_REGISTER_F(benchmarker, 
logIntPlusFloatValueFMT)->Name("Logging int+fl
 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)
+BENCHMARK_DEFINE_F(benchmarker, asyncIntValueMessageBuffer)(benchmark::State& 
state)
 {
-       auto logger = Logger::getLogger(LOG4CXX_STR("bench_logger"));
-       logger->removeAllAppenders();
-       logger->setAdditivity(false);
-       logger->setLevel(Level::getInfo());
-
-       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);
-       logger->addAppender(asyncAppender);
+       int x = 0;
+       for (auto _ : state)
+       {
+               LOG4CXX_INFO( m_asyncLogger, "Hello: message number " << ++x);
+       }
 }
-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_REGISTER_F(benchmarker, asyncIntValueMessageBuffer)->Name("Async, 
int value using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, asyncIntValueMessageBuffer)->Name("Async, 
int value using MessageBuffer, pattern: 
%m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_MAIN();
 

Reply via email to