[slf4j-user] Formatted logs and benchmarks

Sebastien Pennec sebastien at qos.ch
Fri Jan 19 11:42:34 CET 2007


Martin,

Sorry for the misreading of your code.

Measuring a complete log is actually a good idea. I was pointing this because you 
mentionned that you had trouble obtaining consistent results, which I had not using 
my code. This and the first "dry" run were the two main differences between your code 
and mine.

Cheers,

Sébastien

Martin Gilday wrote:
> Sébastien,
> 
> I was trying to see how much slower a complete log would be including
> the formatting.  What you say about debugf is not fully correct.  Inside
> the debugf method I have an isDebugEnabled check before any formatting
> takes place.
> 
> Martin.
> 
> 
> ----- Original message -----
> From: "Sebastien Pennec" <sebastien at qos.ch>
> To: "User list for the slf4j project" <user at slf4j.org>
> Date: Fri, 19 Jan 2007 10:45:43 +0100
> Subject: Re: [slf4j-user] Formatted logs and benchmarks
> 
> Hello Martin,
> 
> The first run changes the figures quite a bit. If you add a first
> unmeasured run, 
> your results will probably be changed in a rather visible manner.
> 
> Also, by looking at your test class, you seem to measure the time it
> takes to log, 
> not to format only. In your FormattedLogger class, the debugf() method
> redirects the 
> logging to a usual debug method. Depending on the components that are
> called after 
> this method, the results may vary in an important fashion, given that
> the StopWatch 
> is started and stopped at the beginning and the end of the for loop.
> 
> Another thing that might be important here is the time it takes *not to
> log*. Quite 
> often, the logger.xxxx() method will not result in an actual logging
> message output 
> somewhere. For example, a call to the debug() method when a filter
> denies all events 
> whose level is INFO and below will not produce any output. In that case,
> the use of a 
> String.format() method before the actual call to the logger method will
> cost the time 
> of formatting the message even if the request is not processed any
> further.
> 
> Admittedly, the advanced formatting provided by String.format() is
> certainly not used 
> by many people in such a situation.
> 
> Hope this helps,
> 
> Sébastien
> 
> Martin Gilday wrote:
>> Hi Sébastien,
>>
>> Thank you for your detailed reply.  For my test[1] I used the StopWatch
>> class from the Spring framework.  I then had a loop which ran 1000 log
>> calls.  I didn't have a second run as you have, but I think I should add
>> it to mine as well.  I founda a similar increase in the time taken. 
>> This suggests that String.format is probably too slow to be used in a
>> production system.  The advanced formatting it provides is possibly not
>> needed in most cases.
>>
>> [1]
>> http://www.martingilday.org/svn/repos/FormattedLogger/trunk/src/test/java/org/martingilday/formattedLogger/FormattedLoggerUnitTest.java
>>
>> Regards,
>> Martin
>>
>>
>> ----- Original message -----
>> From: "Sebastien Pennec" <sebastien at qos.ch>
>> To: "User list for the slf4j project" <user at slf4j.org>
>> Date: Thu, 18 Jan 2007 18:54:10 +0100
>> Subject: Re: [slf4j-user] Formatted logs and benchmarks
>>
>> Hello Martin,
>>
>> I've run some tests, comparing org.slf4j.impl.MessageFormatter
>> and String.format() with java.util.Formatter.
>>
>> Every test was run in a 10'000 loop. The figures are averages of the
>> formatting 
>> duration measured 10'000 times. Also, every test looped twice not to be
>> influenced by 
>> the just in time compiler. Only the second time is measured. I measured
>> only the time 
>> it took to format the message, by using Long variables that were fed
>> with 
>> System.nanoTime() right before and after the call to the formatting
>> method.
>>
>> Here are the results:
>>
>> MessageFormatter.arrayFormat(String message, Object[] argArray);
>> 1 param: 1318 nanos on average.
>> 2 params: 1724 nanos on average.
>> 3 params: 2150 nanos on average.
>>
>> Arguments for String.format(String format, Object ... args):
>> %d int
>> %s String
>> %tc Date, Calender or millis
>>
>> No formatting:
>> 1 param: %d: 9943 nanos on average
>> 2 params: %d: 12500 nanos on average
>> 3 params: %d: 14993 nanos on average
>>
>> 1 param %s: 8588 nanos on average
>> 2 params %s: 11383 nanos on average
>> 3 params %s: 13164 nanos on average
>>
>> 2 params: %s and %d: 12747 nanos on average
>> 2 params: %s and %tc: 26650 nanos on average with a Date object
>>
>> With formatting:
>> 1 param: %,.2f 22842 nanos on average
>>
>> Empty array:
>> MessageFormatter: 1598 on average
>> String.format: 8930 on average
>>
>> I ran each tests several times, and the values where always rather close
>> to the ones 
>> above. I didn't expect them to be equal each time, since we're measuring
>> nanoseconds...
>>
>> These values give a clear advantage to the MessageFormatter.
>>
>> As far as I know, there is no official way of recording this kind of
>> benchmarks on 
>> the SLF4J project. The method I used might not be the best one, although
>> I think it 
>> gives a rather precise result.
>>
>> How did you run your tests? Did you find results that are close to the
>> ones above?
>>
>> Cheers,
>>
>> Sébastien
>>
>>
>> Martin Gilday wrote:
>>> There has previously been a discussion on this mailing list about the
>>> possibility of adding varargs to slf4j.  Since then I have made an
>>> attempt to tidy up some of my projects by writing a wrapper for the
>>> log4j Logger class.[1][2]
>>> As part of this I took what someone suggested on the mailing list of
>>> using java.util.Formatter for building up the log messages inside the
>>> log call.  In slf4j a similar substitution into the log message takes
>>> place.  I have found it reasonably difficult to achieve a consistant
>>> benchmark of the effect of this String.format call, ranging from almost
>>> equal to over 3 times slower.  
>>>
>>> Are there any existing benchmarks on the effect of your substitutions in
>>> slf4j, or any effective ways of recording them?
>>>
>>> Thank you for your time,
>>> Martin Gilday
>>>
>>> [1] http://www.martingilday.org/updates/Formatted+Logger
>>> [2]
>>> http://www.martingilday.org/svn/repos/FormattedLogger/trunk/src/main/java/org/martingilday/formattedLogger/FormattedLogger.java
>>> _______________________________________________
>>> user mailing list
>>> user at slf4j.org
>>> http://www.slf4j.org/mailman/listinfo/user
>>>
> 

-- 
Sébastien Pennec
sebastien at qos.ch

Logback: The reliable, generic, fast and flexible logging framework for Java.
http://logback.qos.ch/



More information about the slf4j-user mailing list