carnold     2005/02/09 21:07:31

  Modified:    performance Makefile.am main.cpp
               tests/input Makefile.am
  Added:       tests    performance.xml
               tests/input/ndc Makefile.am
               tests/input/performance Makefile.am file-bufferedio.xml
                        file-noflush.xml file.xml null-appender-info.xml
                        null-appender.xml off.xml telnet.xml
  Removed:     performance logging.sh
  Log:
  LOGCXX-57: Rework performance test as port of log4j's
  
  Revision  Changes    Path
  1.8       +0 -3      logging-log4cxx/performance/Makefile.am
  
  Index: Makefile.am
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/performance/Makefile.am,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Makefile.am       16 Dec 2004 00:21:46 -0000      1.7
  +++ Makefile.am       10 Feb 2005 05:07:31 -0000      1.8
  @@ -1,4 +1,3 @@
  -SUBDIRS = xml
   noinst_PROGRAMS = logging
   
   performanceincdir = $(includedir)/log4cxx
  @@ -9,5 +8,3 @@
   logging_SOURCES = main.cpp nullappender.cpp
   logging_LDADD = $(top_builddir)/src/liblog4cxx.la
   
  -EXTRA_DIST = logging.sh
  -
  
  
  
  1.15      +152 -116  logging-log4cxx/performance/main.cpp
  
  Index: main.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/performance/main.cpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- main.cpp  4 Jan 2005 03:37:07 -0000       1.14
  +++ main.cpp  10 Feb 2005 05:07:31 -0000      1.15
  @@ -14,142 +14,178 @@
    * limitations under the License.
    */
   
  -#include <log4cxx/ndc.h>
  -#include <log4cxx/logmanager.h>
   #include <log4cxx/logger.h>
  -#include <log4cxx/helpers/exception.h>
  -#include <log4cxx/helpers/optionconverter.h>
  -#include <log4cxx/xml/domconfigurator.h>
  -#include <apr_general.h>
  -#include <apr_pools.h>
  +#include <apr.h>
   #include <apr_time.h>
   #include <iostream>
  -
  -#define _T(str) str
  +#include <log4cxx/helpers/transcoder.h>
  +#include <log4cxx/stream.h>
  +#include <log4cxx/appender.h>
  +#include <sstream>
  +#include "nullappender.h"
  +#include <log4cxx/consoleappender.h>
  +#include <log4cxx/patternlayout.h>
  +#include <log4cxx/helpers/pool.h>
  +#include <log4cxx/xml/domconfigurator.h>
  +#include <log4cxx/stream.h>
   
   using namespace log4cxx;
   using namespace log4cxx::helpers;
  +using namespace log4cxx::performance;
  +using namespace log4cxx::xml;
   
  -int runLength;
  -int delay = -1;
  -/*
  - A delay is applied after every <code>burstLen</code> log
  - requests.  The default value of this constant is 100.  */
  -int burstLen = 100;
  -int DELAY_MULT = 1000/burstLen;
   
  -LoggerPtr logger = 
Logger::getLogger(_T("A0123456789.B0123456789.C0123456789"));
   
  -void Usage(const std::string& processName, const std::string& msg)
  -{
  -        std::cerr << msg << std::endl;
  -        std::cerr <<
  -                "Usage: " << processName
  -                << " confFile runLength [delay] [burstLen]" << std::endl
  -                << "       confFile is an XML configuration file and" << 
std::endl
  -                << "       runLength (integer) is the length of test loop." 
<< std::endl
  -                << "       delay is the time in millisecs to wait every 
burstLen log requests." << std::endl;
  -        exit(EXIT_FAILURE);
  -}
  +/**
  + * Logs in a loop a number of times and measure the elapsed time.
  + *
  + * @author Ceki G&uuml;lc&uuml;
  + */
  +class Loop {
  +  static int runLength;
  +  static LoggerPtr logger;
  +  typedef long (*loopFunc)(long,LoggerPtr&);
  +  static loopFunc loop;
  +public:
  +
  +  static void main(std::vector<LogString>& args)  {
  +    LoggerPtr j(Logger::getLogger("org.apache.log4j.joran"));
  +    j->setAdditivity(false);
  +    j->setLevel(Level::WARN);
  +    AppenderPtr a(new ConsoleAppender());
  +    a->setLayout(new PatternLayout(LOG4CXX_STR("%d %level %c - %m%n")));
  +    a->setName(LOG4CXX_STR("console"));
  +    Pool p;
  +    a->activateOptions(p);
  +    j->addAppender(a);
  +
  +    if (args.size() >= 2) {
  +      init(args);
  +    } else {
  +      usage("Wrong number of arguments.");
  +    }
   
  +    //memPrint();
  +    (*loop)(1000, logger);
  +    //memPrint();
  +
  +    long res = (*loop)(runLength, logger);
  +    double average = (res * 1000.0) / runLength;
  +    std::cout <<
  +      "Loop completed in [" << res << "] milliseconds, or [" << average
  +      << "] microseconds per log.";
  +
  +    //memPrint();
  +  }
  +
  +  static void usage(const char* msg) {
  +    std::cout << msg << '\n';
  +    std::cout <<
  +      "Usage: performance runLength configFile [char wide stream wide-stream 
bad-stream bad-wide-stream]\n";
  +    std::cout << "\trunLength (integer) is the length of test loop.";
  +    std::cout << "\tconfigFile is an XML configuration file";
  +
  +    exit(1);
  +  }
  +
  +  static void memPrint() {
  +  }
  +
  +  static void init(std::vector<LogString>& args) {
  +    std::basic_istringstream<logchar> is(args[0]);
  +    is >> runLength;
  +    DOMConfigurator::configure(args[1]);
  +    if (args.size() == 3) {
  +      if(args[2] == LOG4CXX_STR("char")) {
  +        loop = Loop::loopChar;
  +      } else if (args[2] == LOG4CXX_STR("wide")) {
  +        loop = Loop::loopWide;
  +      } else if (args[2] == LOG4CXX_STR("stream")) {
  +        loop = Loop::loopStream;
  +      } else if (args[2] == LOG4CXX_STR("wide-stream")) {
  +        loop = Loop::loopWideStream;
  +      } else if (args[2] == LOG4CXX_STR("bad-stream")) {
  +        loop = Loop::loopBadStream;
  +      } else if (args[2] == LOG4CXX_STR("bad-wide-stream")) {
  +        loop = Loop::loopBadWideStream;
  +      } else {
  +        usage("Unrecognized loop type.");
  +      }
  +    }
  +  }
   
  -void init(const std::string& configFile, const std::string& runLengthStr,
  -                  const std::string& delayStr, const std::string& 
burstLenStr)
  -{
  -        runLength = atoi(runLengthStr.c_str());
  -        if (runLength < 1)
  -        {
  -                throw IllegalArgumentException("run Length must be greater 
than 0");
  -        }
  -        if (!delayStr.empty())
  -        {
  -                delay = atoi(delayStr.c_str());
  -        }
  -        if (!burstLenStr.empty())
  -        {
  -                burstLen = atoi(burstLenStr.c_str());
  -                DELAY_MULT = 1000/burstLen;
  -        }
  +  static long loopChar(long len, LoggerPtr& logger) {
  +    const char* msg = "Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    for (int i = 0; i < len; i++) {
  +      LOG4CXX_DEBUG(logger, msg);
  +    }
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -#ifdef LOG4CXX_HAVE_XML
  -        xml::DOMConfigurator::configure(configFile);
  -#endif
  -}
  +  static long loopWide(long len, LoggerPtr& logger) {
  +    const wchar_t* msg = L"Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    for (int i = 0; i < len; i++) {
  +      LOG4CXX_DEBUG(logger, msg);
  +    }
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -double NoDelayLoop(LoggerPtr logger, const std::string& msg)
  -{
  -    log4cxx_time_t before = apr_time_now();
  -    for(int i = 0; i < runLength; i++) {
  -        logger->info(msg, LOG4CXX_LOCATION);
  +  static long loopStream(long len, LoggerPtr& logger) {
  +    const char* msg = "Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    logstream ls(logger, Level::DEBUG);
  +    for (int i = 0; i < len; i++) {
  +      ls << msg << LOG4CXX_ENDMSG;
       }
  -    log4cxx_time_t after = apr_time_now();
  -    return (after - before)/(runLength*1000);
  -}
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -double DelayedLoop(LoggerPtr logger, const std::string& msg)
  -{
  +  static long loopWideStream(long len, LoggerPtr& logger) {
  +    const wchar_t* msg = L"Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    logstream ls(logger, Level::DEBUG);
  +    for (int i = 0; i < len; i++) {
  +      ls << msg << LOG4CXX_ENDMSG;
  +    }
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -    log4cxx_time_t before = apr_time_now();
  -    int j = 0;
  -    for(int i = 0; i < runLength; i++)
  -        {
  -                logger->info(msg, LOG4CXX_LOCATION);
  -                if(j++ == burstLen)
  -                {
  -                        j = 0;
  -                        try
  -                        {
  -                                apr_sleep(delay * 1000);
  -                        }
  -                        catch(Exception&)
  -                        {
  -                        }
  -                }
  -
  -    }
  -    double actualTime = (apr_time_now()-before)/(runLength*1000);
  -    std::cout << "actual time: " << actualTime << std::endl;
  -    return (actualTime - delay*DELAY_MULT);
  -}
  +  static long loopBadStream(long len, LoggerPtr& logger) {
  +    const char* msg = "Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    for (int i = 0; i < len; i++) {
  +      logstream ls(logger, Level::DEBUG);
  +      ls << msg << LOG4CXX_ENDMSG;
  +    }
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -int main(int argc, const char* const argv[])
  -{
  -        apr_app_initialize(&argc, &argv, NULL);
  -        int ret = EXIT_SUCCESS;
  +  static long loopBadWideStream(long len, LoggerPtr& logger) {
  +    const wchar_t* msg = L"Some fix message of medium length.";
  +    apr_time_t before = apr_time_now();
  +    for (int i = 0; i < len; i++) {
  +      logstream ls(logger, Level::DEBUG);
  +      ls << msg << LOG4CXX_ENDMSG;
  +    }
  +    return (apr_time_now() - before) / 1000;
  +  }
   
  -        try
  -        {
  -                if(argc == 3)
  -                        init(argv[1], argv[2], "", "");
  -                else if(argc == 5)
  -                        init(argv[1], argv[2], argv[3], argv[4]);
  -                else
  -                        Usage(argv[0], "Wrong number of arguments.");
  -
  -
  -                NDC::push(_T("some context"));
  -
  -                double delta;
  -                std::string msg = 
_T("ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890");
  -                if(delay <= 0)
  -                {
  -                        delta = NoDelayLoop(logger, msg);
  -                }
  -                else
  -                {
  -                        delta = DelayedLoop(logger, msg);
  -                }
   
  -                std::cout << (int)delta << std::endl;
  +};
   
  -                LogManager::shutdown();
  -        }
  -        catch(Exception&)
  -        {
  -                ret = EXIT_FAILURE;
  -        }
  +LoggerPtr 
Loop::logger(Logger::getLogger("org.apache.log4j.performance.Loop"));
  +int Loop::runLength = 0;
  +Loop::loopFunc Loop::loop = Loop::loopChar;
   
  -        apr_terminate();
   
  -        return ret;
  +int main(int argc, const char* const argv[])
  +{
  +        apr_app_initialize(&argc, &argv, NULL);
  +        std::vector<LogString> args(argc - 1);
  +        for (int i = 1; i < argc; i++) {
  +           Transcoder::decode(argv[i], args[i - 1]);
  +        }
  +        Loop::main(args);
   }
  
  
  
  1.1                  logging-log4cxx/tests/performance.xml
  
  Index: performance.xml
  ===================================================================
  <project name="log4cxx-performance" default="usage" basedir="." >
  
    <property name="runlen"  value="100000"/>
    <property name="loop" value="char"/>
    <property name="debug" value="true"/>
    <property name="log4cxx.lib.type" value="shared"/>
  
    <target name="usage">
      <echo>
        These are the targets supported by this ANT build scpript:
  
        all - run all performance tests
        null         - run performance tests using NullAppender
        file         - run performance tests using FileAppender
        file-noflush - run performance tests using FileAppender without 
immediate flush
        file-bufferedio - run performance tests using FileAppender without 
buffered IO
        telnet - run performace tests with TelnetAppender
  
        -Dloop=[char wide stream wide-stream bad-stream bad-wide-stream]
        -Drunlen=100000
      </echo>
    </target>
  
    <target name="clean">
     <delete>
        <fileset dir="./output/" includes="**"/>
      </delete>
     </target>
  
    <target name="all" depends="off, null, file, file-noflush, 
file-bufferedio"/>
  
  
    <target name="off">
      <echo message="*** logging with hierarchy threshold = off ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/off.xml"/>
      </antcall>
    </target>
  
    <target name="null">
      <echo message="*** logging with NullAppender ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/null-appender.xml"/>
      </antcall>
    </target>
  
    <target name="file" depends="clean">
      <echo message="*** logging with FileAppender ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/file.xml"/>
      </antcall>
    </target>
  
    <target name="file-noflush" depends="clean">
      <echo message="*** logging with FileAppender, ImmediateFlush=false ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/file-noflush.xml"/>
      </antcall>
    </target>
  
    <target name="file-bufferedio" depends="clean">
      <echo message="*** logging with FileAppender, BufferedIO=true ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/file-bufferedio.xml"/>
      </antcall>
    </target>
  
    <target name="telnet" depends="clean">
      <echo message="*** logging with TelnetAppender ***"/>
      <antcall target="loop-group">
        <param name="configFile" value="input/performance/telnet.xml"/>
      </antcall>
    </target>
  
  
  
    <target name="loop">
      <condition property="lib-suffix" value="d">
          <istrue value="${debug}"/>
      </condition>
      <property name="lib-suffix" value=""/>
      <condition property="log4cxx.lib.dir" 
value="../build/debug/${log4cxx.lib.type}">
          <istrue value="${debug}"/>
      </condition>
      <property name="log4cxx.lib.dir"  
value="../build/release/${log4cxx.lib.type}"/>
      <property name="apr.lib.dir" value="${log4cxx.lib.dir}"/>
      <property name="aprutil.lib.dir" value="${apr.lib.dir}"/>
      <property name="apriconv.lib.dir" value="${aprutil.lib.dir}"/>
  
      <echo message="Pattern is ${pattern}"/>
  
      <exec executable="${log4cxx.lib.dir}/performance">
          <arg value="${runlen}"/>
          <arg value="${configFile}"/>
          <arg value="${loop}"/>
          <env key="pattern" value="${pattern}"/>
          <env key="LD_LIBRARY_PATH"
                 
value="${log4cxx.lib.dir}:${apr.lib.dir}:${aprutil.lib.dir}:${apriconv.lib.dir}:${env.LD_LIBRARY_PATH}"/>
          <env key="DYLD_LIBRARY_PATH"
                 
value="${log4cxx.lib.dir}:${apr.lib.dir}:${aprutil.lib.dir}:${apriconv.lib.dir}:${env.DYLD_LIBRARY_PATH}"/>
      </exec>
    </target>
  
    <target name="loop-group">
      <mkdir dir="output"/>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%p - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%-5p - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%r [%t] %-5p %c{2} %x - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%r [%t] %-5p %.10c %x - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%r [%t] %-5p %.20c %x - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%r [%t] %-5p %c - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%d{ISO8601} [%t] %-5p %c %x - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c 
%x - %m%n"/>
      </antcall>
      <antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%l - %m%n"/>
      </antcall>
      <!-- antcall target="loop">
        <param name="configFile" value="${configFile}"/>
        <param name="pattern" value="%C.%M.%L - %m%n"/>
      </antcall -->
    </target>
  
  
  </project>
  
  
  
  1.2       +1 -1      logging-log4cxx/tests/input/Makefile.am
  
  Index: Makefile.am
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/tests/input/Makefile.am,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Makefile.am       18 Jan 2004 16:24:29 -0000      1.1
  +++ Makefile.am       10 Feb 2005 05:07:31 -0000      1.2
  @@ -1,2 +1,2 @@
  -SUBDIRS = xml
  +SUBDIRS = ndb performance xml
   EXTRA_DIST = *.properties
  
  
  
  1.1                  logging-log4cxx/tests/input/ndc/Makefile.am
  
  Index: Makefile.am
  ===================================================================
  EXTRA_DIST = *.properties
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/Makefile.am
  
  Index: Makefile.am
  ===================================================================
  EXTRA_DIST = *.xml
  
  
  
  1.1                  
logging-log4cxx/tests/input/performance/file-bufferedio.xml
  
  Index: file-bufferedio.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="FILE" class="org.apache.log4j.FileAppender">
      <param name="File" value="output/temp.${build.number}"/>
      <param name="BufferedIO" value="true"/>
      <param name="Append" value="false"/>
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
    
    <root>
      <level value="debug" />
      <appender-ref ref="FILE" />
    </root>
    
  </log4j:configuration>
  
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/file-noflush.xml
  
  Index: file-noflush.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="FILE" class="org.apache.log4j.FileAppender">
      <param name="File" value="output/temp.${build.number}"/>
      <param name="ImmediateFlush" value="false"/>
      <param name="Append" value="false"/>
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
    
    <root>
      <level value="debug" />
      <appender-ref ref="FILE" />
    </root>
    
  </log4j:configuration>
  
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/file.xml
  
  Index: file.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="FILE" class="org.apache.log4j.FileAppender">
      <param name="File" value="output/temp.${build.number}"/>
      <param name="ImmediateFlush" value="true"/>
      <param name="Append" value="false"/>
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
    
    <root>
      <level value="debug" />
      <appender-ref ref="FILE" />
    </root>
    
  </log4j:configuration>
  
  
  
  1.1                  
logging-log4cxx/tests/input/performance/null-appender-info.xml
  
  Index: null-appender-info.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <!-- This config file has the root logger set to the "info" level. It is
       used by the ANT build file "performance.xml". 
  -->
  
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="NULL" class="org.apache.log4j.performance.NullAppender">
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
  
    <appender name="CON" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %c - %m%n"/>
      </layout>
    </appender>
    
    <root>
      <level value="info" />
      <appender-ref ref="NULL" />
      <appender-ref ref="CON" />
    </root>
    
  </log4j:configuration>
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/null-appender.xml
  
  Index: null-appender.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="NULL" class="org.apache.log4j.performance.NullAppender">
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
  
    <root>
      <level value="debug" />
      <appender-ref ref="NULL" />
    </root>
    
  </log4j:configuration>
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/off.xml
  
  Index: off.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/' 
threshold="off"/>
  
  
  
  1.1                  logging-log4cxx/tests/input/performance/telnet.xml
  
  Index: telnet.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  
  <log4j:configuration xmlns:log4j='http://logging.apache.org/'>
  
    <appender name="TELNET" class="org.apache.log4j.net.TelnetAppender">
      <param name="port" value="7023"/>
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="${pattern}"/>
      </layout>
    </appender>
  
    <root>
      <level value="debug" />
      <appender-ref ref="TELNET" />
    </root>
  
  </log4j:configuration>
  
  
  

Reply via email to