Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

org.apache.log4j.performance
Class Logging  view Logging download Logging.java

java.lang.Object
  extended byorg.apache.log4j.performance.Logging

public class Logging
extends java.lang.Object

Measure the performance of logging.

Experimental results are listed below in units of micro-seconds. Measurements were done on a AMD Duron clocked at 800Mhz running Windows 2000 and Sun's 1.3 JDK.

Layout NullAppender FileAppender FileAppender (no flush) AsyncAppender (no flush)
SimpleLayout 4 21 16 33
PatternLayout "%p - %m%n" 4 21 16 32
PatternLayout "%-5p - %m%n" 4 NA NA NA
TTCCLayout/RELATIVE 10 37 31 45
PatternLayout "%r [%t] %-5p %c{2} %x - %m%n" 11 NA NA NA
PatternLayout "%r [%t] %-5p %.10c %x - %m%n" 11 NA NA NA
PatternLayout "%r [%t] %-5p %.20c %x - %m%n" 11 NA NA NA
PatternLayout "%r [%t] %-5p %c - %m%n" 9 36 29 45
TTCCLayout/ISO8601 25 58 51 71
PatternLayout "%d{ISO8601} [%t] %-5p %c %x - %m%n" 28 62 55 76
PatternLayout "%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n" 46 82 72 94
PatternLayout "%l - %m%n" 241 317 299 251
PatternLayout "%C.%M.%L - %m%n" 267 NA NA NA

The results of the measurements (should) show that:

  1. The PatternLayout perforance is very close to the performance of a dedicated layout of equivalent format.

  2. Format specifiers in conversion patterns have almost no impact on performance.

  3. Formating time and date information is costly. Using relative time has the least impact on performance. It is recommended that to use log4j specific date formatters such as the org.apache.log4j.helpers.ISO8601DateFormat instead of the standard java.text.SimpleDateFormat because of its poor performance. See the %d conversion character in org.apache.log4j.PatternLayout.

  4. Avoiding the flush operation at the end of each append results in a performance gain of 10 to 20 percent. However, there is safety tradeoff invloved in skipping flushing. Indeed, when flushing is skipped, then it is likely that the last few log events will not be recorded on disk when the application exits. This is a high price to pay even for a 20% performance gain.

  5. The AsyncAppender does not automatically increase performance. On the contrary, it significantly degrades performance. The performance tests done here very quickly fill up the bounded buffer of the AsyncAppender and there is cosiderable overhead in managing this bounded buffer.

    On the other hand, had we interleaved logging operations with long blocking and non CPU-intensive operations, such as I/O, network access, sleeping threads, then the AsyncAppender would have tremendously reduced the cost of logging in terms of overall application runtime.

    In a variant of this test, we have inserted a short sleep operation between every 10 log operations. When the total slept time is substracted, logging with the AsyncLogger takes no time at all. In other words, logging is done for "free".

  6. Extracting location information is comparatively slow. It implies at least a ten fold increase in logging time! It should be avoided unless performace is not a concern. It has been reported from a trusted source that logging with location information on AIX machines will kill your application's performance.


Field Summary
(package private) static int burstLen
          A delay is applied after every burstLen log requests.
(package private) static org.apache.log4j.Category cat
           
(package private) static int delay
           
(package private) static int DELAY_MULT
           
(package private) static int runLength
           
 
Constructor Summary
Logging()
           
 
Method Summary
(package private) static double DelayedLoop(org.apache.log4j.Category category, java.lang.String msg)
           
(package private) static void init(java.lang.String configFile, java.lang.String runLengthStr, java.lang.String delayStr, java.lang.String burstLenStr)
          Program wide initialization method.
static void main(java.lang.String[] argv)
          Usage: java org.apache.log4j.performance.Logging confFile runLength [delay] [burstLen]
(package private) static double NoDelayLoop(org.apache.log4j.Category category, java.lang.String msg)
           
(package private) static void Usage(java.lang.String msg)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

runLength

static int runLength

delay

static int delay

burstLen

static int burstLen
A delay is applied after every burstLen log requests. The default value of this constant is 100.


DELAY_MULT

static int DELAY_MULT

cat

static org.apache.log4j.Category cat
Constructor Detail

Logging

public Logging()
Method Detail

Usage

static void Usage(java.lang.String msg)

main

public static void main(java.lang.String[] argv)
Usage: java org.apache.log4j.performance.Logging confFile runLength [delay] [burstLen]

confFile is an XML configuration file and runLength (integer) is the length of test loop, delay is the time in millisecs to sleep every bustLen log requests.

This application just prints the average time it took to log.


init

static void init(java.lang.String configFile,
                 java.lang.String runLengthStr,
                 java.lang.String delayStr,
                 java.lang.String burstLenStr)
Program wide initialization method.


NoDelayLoop

static double NoDelayLoop(org.apache.log4j.Category category,
                          java.lang.String msg)

DelayedLoop

static double DelayedLoop(org.apache.log4j.Category category,
                          java.lang.String msg)