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

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


The following commit(s) were added to refs/heads/master by this push:
     new 76b3ad2f Improve utility of benchmark checks (#355)
76b3ad2f is described below

commit 76b3ad2f7ec99c9eb460ab9852149f4763a0310b
Author: Stephen Webb <[email protected]>
AuthorDate: Sun Feb 25 12:40:59 2024 +1100

    Improve utility of benchmark checks (#355)
---
 src/test/cpp/benchmark/benchmark.cpp | 129 +++++++++++++++++++++++------------
 1 file changed, 87 insertions(+), 42 deletions(-)

diff --git a/src/test/cpp/benchmark/benchmark.cpp 
b/src/test/cpp/benchmark/benchmark.cpp
index bb9f9ebf..1adca690 100644
--- a/src/test/cpp/benchmark/benchmark.cpp
+++ b/src/test/cpp/benchmark/benchmark.cpp
@@ -5,6 +5,9 @@
 #include <log4cxx/helpers/optionconverter.h>
 #include <log4cxx/helpers/stringhelper.h>
 #include <log4cxx/asyncappender.h>
+#include <log4cxx/net/smtpappender.h>
+#include <log4cxx/fileappender.h>
+#include <log4cxx/private/appenderskeleton_priv.h>
 #if LOG4CXX_USING_STD_FORMAT
 #include <format>
 #elif LOG4CXX_HAS_FMT
@@ -20,17 +23,10 @@ using namespace log4cxx;
 class NullWriterAppender : public AppenderSkeleton
 {
 public:
-       DECLARE_LOG4CXX_OBJECT(NullWriterAppender)
-       BEGIN_LOG4CXX_CAST_MAP()
-       LOG4CXX_CAST_ENTRY(NullWriterAppender)
-       LOG4CXX_CAST_ENTRY_CHAIN(AppenderSkeleton)
-       END_LOG4CXX_CAST_MAP()
-
-       NullWriterAppender() {}
-
        NullWriterAppender(const LayoutPtr& layout)
-               : AppenderSkeleton(layout)
-       {}
+       {
+               setLayout(layout);
+       }
 
        void close() override {}
 
@@ -41,12 +37,12 @@ public:
 
        void append(const spi::LoggingEventPtr& event, helpers::Pool& p) 
override
        {
-               // This gets called whenever there is a valid event for our 
appender.
+               LogString buf;
+               m_priv->layout->format(buf, event, p);
        }
 
        void activateOptions(helpers::Pool& /* pool */) override
        {
-               // Given all of our options, do something useful(e.g. open a 
file)
        }
 
        void setOption(const LogString& option, const LogString& value) override
@@ -54,19 +50,33 @@ public:
        }
 };
 
+class BenchmarkFileAppender : public FileAppender
+{
+public:
+       BenchmarkFileAppender(const LayoutPtr& layout)
+       {
+               setLayout(layout);
+               auto tempDir = 
helpers::OptionConverter::getSystemProperty(LOG4CXX_STR("TEMP"), 
LOG4CXX_STR("/tmp"));
+               setFile(tempDir + LOG4CXX_STR("/") + 
LOG4CXX_STR("benchmark.log"));
+               setAppend(false);
+               setBufferedIO(true);
+               helpers::Pool p;
+               activateOptions(p);
+       }
+};
+
 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: // Attributes
        LoggerPtr m_logger = getLogger();
        LoggerPtr m_asyncLogger = getAsyncLogger();
+       LoggerPtr m_fileLogger = getFileLogger();
 
 public: // Class methods
        static int threadCount()
@@ -95,9 +105,9 @@ public: // Class methods
                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);
+                       auto writer = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
+                       writer->setName(LOG4CXX_STR("NullAppender"));
+                       r->getRootLogger()->addAppender(writer);
                        });
        }
 
@@ -114,9 +124,9 @@ public: // Class methods
                        result = r->getLogger(name);
                        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);
+                       auto writer = 
std::make_shared<NullWriterAppender>(std::make_shared<PatternLayout>(pattern));
+                       writer->setName(LOG4CXX_STR("NullAppender.") + pattern);
+                       result->addAppender(writer);
                }
                return result;
        }
@@ -129,9 +139,11 @@ public: // Class methods
                LoggerPtr result = r->exists(name);
                if (!result)
                {
-                       auto nullWriter = 
r->getRootLogger()->getAppender(LOG4CXX_STR("NullWriterAppender"));
+                       auto writer = std::make_shared<net::SMTPAppender>();
+                       
writer->setLayout(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
                        auto asyncAppender = std::make_shared<AsyncAppender>();
-                       asyncAppender->addAppender(nullWriter);
+                       asyncAppender->addAppender(writer);
+                       asyncAppender->setBlocking(true);
                        result = r->getLogger(name);
                        result->setAdditivity(false);
                        result->setLevel(Level::getInfo());
@@ -139,6 +151,24 @@ public: // Class methods
                }
                return result;
        }
+
+       static LoggerPtr getFileLogger()
+       {
+               LogString name = LOG4CXX_STR("benchmark.fixture.file");
+               setDefaultAppender();
+               auto r = LogManager::getLoggerRepository();
+               LoggerPtr result;
+               if (!(result = r->exists(name)))
+               {
+                       result = r->getLogger(name);
+                       result->setAdditivity(false);
+                       result->setLevel(Level::getInfo());
+                       auto writer = 
std::make_shared<BenchmarkFileAppender>(std::make_shared<PatternLayout>(LOG4CXX_STR("%m%n")));
+                       writer->setName(LOG4CXX_STR("FileAppender"));
+                       result->addAppender(writer);
+               }
+               return result;
+       }
 };
 
 BENCHMARK_DEFINE_F(benchmarker, logDisabledTrace)(benchmark::State& state)
@@ -160,8 +190,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logShortString)(benchmark::State& state)
                LOG4CXX_INFO(m_logger, LOG4CXX_STR("Hello"));
        }
 }
-BENCHMARK_REGISTER_F(benchmarker, logShortString)->Name("Logging 5 char string 
using MessageBuffer, pattern: %m%n");
-BENCHMARK_REGISTER_F(benchmarker, logShortString)->Name("Logging 5 char string 
using MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logShortString)->Name("Appending 5 char 
string using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logShortString)->Name("Appending 5 char 
string using MessageBuffer, pattern: 
%m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_DEFINE_F(benchmarker, logLongString)(benchmark::State& state)
 {
@@ -171,8 +201,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logLongString)(benchmark::State& state)
                LOG4CXX_INFO( m_logger, LOG4CXX_STR("Hello: this is a long 
static string message"));
        }
 }
-BENCHMARK_REGISTER_F(benchmarker, logLongString)->Name("Logging 49 char string 
using MessageBuffer, pattern: %m%n");
-BENCHMARK_REGISTER_F(benchmarker, logLongString)->Name("Logging 49 char string 
using MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logLongString)->Name("Appending 49 char 
string using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logLongString)->Name("Appending 49 char 
string using MessageBuffer, pattern: 
%m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_DEFINE_F(benchmarker, logIntValueMessageBuffer)(benchmark::State& 
state)
 {
@@ -182,8 +212,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logIntValueMessageBuffer)(benchmark::State& stat
                LOG4CXX_INFO( m_logger, "Hello: message number " << ++x);
        }
 }
-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_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Appending 
int value using MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntValueMessageBuffer)->Name("Appending 
int value using MessageBuffer, pattern: 
%m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_DEFINE_F(benchmarker, 
logIntPlusFloatMessageBuffer)(benchmark::State& state)
 {
@@ -195,8 +225,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logIntPlusFloatMessageBuffer)(benchmark::State&
                        << " pseudo-random float " << std::setprecision(3) << 
std::fixed << f);
        }
 }
-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_REGISTER_F(benchmarker, 
logIntPlusFloatMessageBuffer)->Name("Appending int+float using MessageBuffer, 
pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, 
logIntPlusFloatMessageBuffer)->Name("Appending int+float using MessageBuffer, 
pattern: %m%n")->Threads(benchmarker::threadCount());
 
 template <class ...Args>
 void logWithConversionPattern(benchmark::State& state, Args&&... args)
@@ -210,8 +240,8 @@ void logWithConversionPattern(benchmark::State& state, 
Args&&... args)
                LOG4CXX_INFO( logger, LOG4CXX_STR("Hello: msg number ") << ++x);
        }
 }
-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_CAPTURE(logWithConversionPattern, DateMessage, LOG4CXX_STR("[%d] 
%m%n"))->Name("Appending int value using MessageBuffer, pattern: [%d] %m%n");
+BENCHMARK_CAPTURE(logWithConversionPattern, DateClassLevelMessage, 
LOG4CXX_STR("[%d] [%c] [%p] %m%n"))->Name("Appending int value using 
MessageBuffer, pattern: [%d] [%c] [%p] %m%n");
 
 #if  LOG4CXX_USING_STD_FORMAT || LOG4CXX_HAS_FMT
 BENCHMARK_DEFINE_F(benchmarker, logLongStringFMT)(benchmark::State& state)
@@ -221,8 +251,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logLongStringFMT)(benchmark::State& state)
                LOG4CXX_INFO_FMT(m_logger, "Hello: this is a long static string 
message", 0);
        }
 }
-BENCHMARK_REGISTER_F(benchmarker, logLongStringFMT)->Name("Logging 49 char 
string using FMT, pattern: %m%n");
-BENCHMARK_REGISTER_F(benchmarker, logLongStringFMT)->Name("Logging 49 char 
string using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
+BENCHMARK_REGISTER_F(benchmarker, logLongStringFMT)->Name("Appending 49 char 
string using FMT, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logLongStringFMT)->Name("Appending 49 char 
string using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_DEFINE_F(benchmarker, logIntValueFMT)(benchmark::State& state)
 {
@@ -232,8 +262,8 @@ BENCHMARK_DEFINE_F(benchmarker, 
logIntValueFMT)(benchmark::State& state)
                LOG4CXX_INFO_FMT(m_logger, "Hello: msg number {}", ++x);
        }
 }
-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());
+BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Appending int value 
using FMT, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntValueFMT)->Name("Appending int value 
using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_DEFINE_F(benchmarker, logIntPlusFloatValueFMT)(benchmark::State& 
state)
 {
@@ -244,20 +274,35 @@ BENCHMARK_DEFINE_F(benchmarker, 
logIntPlusFloatValueFMT)(benchmark::State& state
                LOG4CXX_INFO_FMT(m_logger, "Hello: msg number {} pseudo-random 
float {:.3f}", ++x, f);
        }
 }
-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());
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Appending 
int+float using FMT, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, logIntPlusFloatValueFMT)->Name("Appending 
int+float using FMT, pattern: %m%n")->Threads(benchmarker::threadCount());
 #endif
 
-BENCHMARK_DEFINE_F(benchmarker, asyncIntValueMessageBuffer)(benchmark::State& 
state)
+BENCHMARK_DEFINE_F(benchmarker, 
asyncIntPlusFloatValueMessageBuffer)(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: message number " << ++x
+                       << " pseudo-random float " << std::setprecision(3) << 
std::fixed << f);
+       }
+}
+BENCHMARK_REGISTER_F(benchmarker, 
asyncIntPlusFloatValueMessageBuffer)->Name("Async, Sending int+float using 
MessageBuffer");
+BENCHMARK_REGISTER_F(benchmarker, 
asyncIntPlusFloatValueMessageBuffer)->Name("Async, Sending int+float using 
MessageBuffer")->Threads(benchmarker::threadCount());
+
+BENCHMARK_DEFINE_F(benchmarker, 
fileIntPlusFloatValueMessageBuffer)(benchmark::State& state)
 {
        int x = 0;
        for (auto _ : state)
        {
-               LOG4CXX_INFO( m_asyncLogger, "Hello: message 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, 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_REGISTER_F(benchmarker, 
fileIntPlusFloatValueMessageBuffer)->Name("Logging int+float using 
MessageBuffer, pattern: %m%n");
+BENCHMARK_REGISTER_F(benchmarker, 
fileIntPlusFloatValueMessageBuffer)->Name("Logging int+float using 
MessageBuffer, pattern: %m%n")->Threads(benchmarker::threadCount());
 
 BENCHMARK_MAIN();
 

Reply via email to