Hi,

I was performance testing the SocketAppender and found it too slow and
CPU intensive.So I made some changes to LoggingEvent.
LoggingEvent is now Externalizable instead of Serializable. This should
be compatible with JDK 1.1 as well.
My performance measurements give me 30-50% more throughput.

BR
Ole Dalgaard

Index: src/java/org/apache/log4j/spi/LocationInfo.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/spi/LocationInfo.java,v
retrieving revision 1.11
diff -w -r1.11 LocationInfo.java
139a140,143
>     public LocationInfo(String fullInfo) {
>         this.fullInfo = fullInfo;
>     }
>     
Index: src/java/org/apache/log4j/spi/LoggingEvent.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java,v
retrieving revision 1.26
diff -w -r1.26 LoggingEvent.java
19a20,23
> import java.io.ObjectOutput;
> import java.io.ObjectInput;
> import java.io.IOException;
> 
38c42
< public class LoggingEvent implements java.io.Serializable {
---
> public class LoggingEvent implements java.io.Externalizable {
53c57
<   public final String categoryName;
---
>   public String categoryName;
160a165,176
>     /**
>      *Used by Externalizable
>      */
>     public LoggingEvent() {
>         this.fqnOfCategoryClass = "";
>         this.logger = null;
>         this.categoryName = "";
>         this.level = null;
>         this.message = "";
>         this.timeStamp = 0L;
>     }
> 
293,295c309
< 
<   private 
<   void readLevel(ObjectInputStream ois) 
---
>     private void readLevel(ObjectInput oi)
298c312
<     int p = ois.readInt();
---
>         int p = oi.readInt();
300,301c314,315
<       String className = (String) ois.readObject();      
<       if(className == null) {
---
>             String className = (String) oi.readUTF();
>             if (className.equals("")) {
319,327d332
<   private void readObject(ObjectInputStream ois)
<                         throws java.io.IOException, ClassNotFoundException {
<     ois.defaultReadObject();    
<     readLevel(ois);
< 
<     // Make sure that no location info is available to Layouts
<     if(locationInfo == null)
<       locationInfo = new LocationInfo(null, null);
<   }
329,333c334
<   private
<   void writeObject(ObjectOutputStream oos) throws java.io.IOException {
<     // Aside from returning the current thread name the wgetThreadName
<     // method sets the threadName variable.
<     this.getThreadName();    
---
>     private void writeLevel(ObjectOutput oo) throws java.io.IOException {
335,336c336
<     // This sets the renders the message in case it wasn't up to now.
<     this.getRenderedMessage();
---
>         oo.writeInt(level.toInt());
338,340c338,346
<     // This call has a side effect of setting this.ndc and
<     // setting ndcLookupRequired to false if not already false.
<     this.getNDC();
---
>         Class clazz = level.getClass();
>         if (clazz == Level.class) {
>             oo.writeUTF("");
>         } else {
>             // writing directly the Class object would be nicer, except that
>             // serialized a Class object can not be read back by JDK
>             // 1.1.x. We have to resort to this hack instead.
>             oo.writeUTF(clazz.getName());
>         }
342,343c348
<     // This sets the throwable sting representation of the event throwable.
<     this.getThrowableStrRep();
---
>     }
345d349
<     oos.defaultWriteObject();
347,348c351,369
<     // serialize this event's level
<     writeLevel(oos);
---
>     public void readExternal(java.io.ObjectInput s)
>     throws ClassNotFoundException, IOException {
>         categoryName = s.readUTF();
>         renderedMessage = s.readUTF();
>         ndc = s.readUTF();
>         threadName = s.readUTF();
>         readLevel(s);
>         int nr = s.readInt();
>         if (nr > 0) {
>             String[] rep = new String[nr];
>             for (int i = 0; i < nr; i++) {
>                 rep[i] = s.readUTF();
>             }
>             throwableInfo = new ThrowableInformation(rep);
>         }
>         String locInfo = s.readUTF();
>         if(!locInfo.equals("")) {
>             locationInfo = new LocationInfo(locInfo);
>         }
351,352c372,376
<   private 
<   void writeLevel(ObjectOutputStream oos) throws java.io.IOException {
---
>     public void writeExternal(java.io.ObjectOutput s)
>     throws IOException {
>         this.getThreadName();
>         this.getRenderedMessage();
>         this.getNDC();
354c378,379
<     oos.writeInt(level.toInt());
---
>         s.writeUTF(categoryName);
>         s.writeUTF(renderedMessage);
356,358c381,387
<     Class clazz = level.getClass();
<     if(clazz == Level.class) {
<       oos.writeObject(null);
---
>         s.writeUTF(ndc == null ? "" : ndc);
>         s.writeUTF(threadName);
>         writeLevel(s);
>         String[] throwableStr = this.getThrowableStrRep();
> 
>         if (throwableStr == null) {
>             s.writeInt(0);
360,363c389,397
<       // writing directly the Class object would be nicer, except that
<       // serialized a Class object can not be read back by JDK
<       // 1.1.x. We have to resort to this hack instead.
<       oos.writeObject(clazz.getName());
---
>             s.writeInt(throwableStr.length);
>             for (int i = 0; i < throwableStr.length; i++) {
>                 s.writeUTF(throwableStr[i]);
>             }
>         }
>         if(locationInfo != null) {
>             s.writeUTF(locationInfo.fullInfo);
>         } else {
>             s.writeUTF("");
Index: src/java/org/apache/log4j/spi/ThrowableInformation.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/spi/ThrowableInformation.java,v
retrieving revision 1.6
diff -w -r1.6 ThrowableInformation.java
31a32,37
>   ThrowableInformation(String[] rep) {
>     this.rep = rep;
>     this.throwable = null;
>   }
> 
>   public

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to