Curt Arnold wrote:
The supposed performance benefit of the SLF4J formatter over the
java.text.MessageFormat only occurs when you compare the performance
against naive use of java.text.MessageFormat. LogMF handles the
simplest pattern specifications (those just involving {0}, {1}, etc)
internally and only delegates to java.text.MessageFormat for more
complex pattern specifications, resulting in equivalent performance to
the SLF4J formatter on functionally equivalent format specifiers while
still supporting the full java.text.MessageFormat capabilities.
For a short message of 25 letters, on my machine, LogMF.format(String,
Object) takes 7.5 microseconds, while the SLF4J formatter takes 1
microsecond. Thus, there is a ratio of 7.5 to 1 in performance.
Given that it takes 5 to 10 microseconds to write a logging event to
file, the LogMF overhead is significant.
To repeat the experiment:
> svn co http://svn.apache.org/repos/asf/logging/log4j/companions/extras/trunk/
extras
> modify LogMF.format(String pattern, Object arg0) method as public instead of
private
> mvn package -Dmaven.test.skip=true
> Add slf4j-api-1.5.6.jar and apache-log4j-extras-1.1-SNAPSHOT.jar (that you
just built) to you class path.
> Run the following unit test
package test;
import org.apache.log4j.LogMF;
import org.junit.Test;
import org.slf4j.helpers.MessageFormatter;
public class XTest {
static int LEN = 100000;
final static String MSG = "Hello Hello Hello Hello {}";
final static String MSG_2 = "Hello Hello Hello Hello {0}";
Integer x = new Integer(1);
@Test
public void testLogMF() {
for(int i = 0; i < LEN; i++ ){
LogMF.format(MSG_2, x);
}
long start = System.nanoTime();
for(int i = 0; i < LEN; i++ ){
LogMF.format(MSG_2, x);
}
long end = System.nanoTime();
System.out.println("LogMF avg="+ (end-start)/LEN);
}
@Test
public void testSLF4J() {
for(int i = 0; i < LEN; i++ ){
MessageFormatter.format(MSG, x);
}
long start = System.nanoTime();
for(int i = 0; i < LEN; i++ ){
MessageFormatter.format(MSG, x);
}
long end = System.nanoTime();
System.out.println("SLF4J avg="+ (end-start)/LEN);
}
On my machine the output is:
LogMF avg=7568
SLF4J avg=1021
Thus, contrary to your claim, LogMF does *not* offer equivalent performance to
SLF4J's formatter.
The SLF4J formatting style, altough not the same as the JDK's, is easier to type
(try it) and less error prone (you can't get the numbers wrong because there are
none). More importantly, SLF4J users love it.
Instead of trying to re-invent the wheel, we, as log4j developers, would do the
java developer community a favor by adopting SLF4J, a popular and stable API. As
mentioned on several occasions by now, there is also a way to conserve 100%
compatibility for existing log4j clients.
--
Ceki Gülcü
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]