alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

//      Copyright 1996-2000, International Business Machines
//      Corporation. All Rights Reserved.

package org.apache.log4j.performance;


import org.apache.log4j.Category;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.ConsoleAppender;

import org.apache.log4j.Level;

/**
   Measure the performance of evaluating whether to log or not to log,
   but not actually logging.

   

This program takes two arguments, a string which should be "true" for testing shipped code performance and "false" for testing debug-enabled performance the second argument is the run length of the measurement loops.

The results of the measurement (should) show that

  • Category evaluation is independent of the length of the category name.

  • As expected, using the {@link Category#isDebugEnabled isDebugEnabled} and {@link Category#isInfoEnabled isInfoEnabled} methods eliminates the overhead of message argument construction.

  • Message argument construction can be an important slowing factor while evaluating whether to log or not.
@author Ceki Gülcü */ public class NotLogging { static int runLength; final static int INITIAL_HASH_SIZE = 101; static String SHORT_MSG = "Hello World"; static Category SHORT_CAT = Category.getInstance("A0123456789"); static Category MEDIUM_CAT= Category.getInstance("A0123456789.B0123456789"); static Category LONG_CAT = Category.getInstance("A0123456789.B0123456789.C0123456789"); static Category INEXISTENT_SHORT_CAT = Category.getInstance("I0123456789"); static Category INEXISTENT_MEDIUM_CAT= Category.getInstance("I0123456789.B0123456789"); static Category INEXISTENT_LONG_CAT= Category.getInstance("I0123456789.B0123456789.C0123456789"); static Category[] CAT_ARRAY = new Category[] {SHORT_CAT, MEDIUM_CAT, LONG_CAT, INEXISTENT_SHORT_CAT, INEXISTENT_MEDIUM_CAT, INEXISTENT_LONG_CAT}; static void Usage() { System.err.println( "Usage: java org.apache.log4j.test.NotLogging true|false runLength\n" + "true indicates shipped code, false indicates code in development" + " where runLength is an int representing the run length of loops\n"+ "We suggest that runLength be at least 100'000."); System.exit(1); } public static void main(String argv[]) { if(argv.length != 2) { Usage(); } ProgramInit(argv); double delta; System.out.println(); for(int i = 0; i < CAT_ARRAY.length; i++) { delta = SimpleMessage(CAT_ARRAY[i], SHORT_MSG, runLength); System.out.println("Simple argument, " + delta + " micros. Cat: " + CAT_ARRAY[i].getName()); } System.out.println(); for(int i = 0; i < CAT_ARRAY.length; i++) { delta = FullyOptimizedComplexMessage(CAT_ARRAY[i], runLength); System.out.println("Fully optimized complex, " + delta + " micros. Cat: " + CAT_ARRAY[i].getName()); } System.out.println(); for(int i = 0; i < CAT_ARRAY.length; i++) { delta = ComplexMessage(CAT_ARRAY[i], runLength); System.out.println("Complex message argument, " + delta + " micros. Cat: " + CAT_ARRAY[i].getName()); } } /** Program wide initialization method. */ static void ProgramInit(String[] args) { try { runLength = Integer.parseInt(args[1]); } catch(java.lang.NumberFormatException e) { System.err.println(e); Usage(); } ConsoleAppender appender = new ConsoleAppender(new SimpleLayout()); if("false".equals(args[0])) { // nothing to do } else if ("true".equals(args[0])) { System.out.println("Flagging as shipped code."); Category.getDefaultHierarchy().setThreshold((Level) Level.WARN); } else Usage(); SHORT_CAT.setLevel((Level) Level.INFO); Category.getRoot().setLevel((Level) Level.INFO); } static double SimpleMessage(Category category, String msg, long runLength) { long before = System.currentTimeMillis(); for(int i = 0; i < runLength; i++) { category.debug(msg); } return (System.currentTimeMillis() - before)*1000.0/runLength; } static double FullyOptimizedComplexMessage(Category category, long runLength) { long before = System.currentTimeMillis(); for(int i = 0; i < runLength; i++) { if(category.isDebugEnabled()) category.debug("Message" + i + " bottles of beer standing on the wall."); } return (System.currentTimeMillis() - before)*1000.0/runLength; } static double ComplexMessage(Category category, long runLength) { long before = System.currentTimeMillis(); for(int i = 0; i < runLength; i++) { category.debug("Message" + i + " bottles of beer standing on the wall."); } return (System.currentTimeMillis() - before)*1000.0/runLength; } }
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.