Author: mrglavas Date: Wed Sep 13 13:43:26 2006 New Revision: 443115 URL: http://svn.apache.org/viewvc?view=rev&rev=443115 Log: Reduce the overhead of creating a ScannedEntity by reusing byte buffers.
This is similar to the improvement introduced in Rev 320110. See: http://svn.apache.org/viewvc?view=rev&revision=320110 Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java?view=diff&rev=443115&r1=443114&r2=443115 ============================================================================== --- xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java (original) +++ xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java Wed Sep 13 13:43:26 2006 @@ -356,6 +356,9 @@ /** Pool of byte buffers. */ private final ByteBufferPool fByteBufferPool = new ByteBufferPool(fBufferSize); + /** Temporary storage for the current entity's byte buffer. */ + private byte[] fTempByteBuffer = null; + /** Pool of character buffers. */ private final CharacterBufferPool fCharacterBufferPool = new CharacterBufferPool(fBufferSize, DEFAULT_INTERNAL_BUFFER_SIZE); @@ -378,7 +381,6 @@ */ public XMLEntityManager(XMLEntityManager entityManager) { - // save shared entity declarations fDeclaredEntities = entityManager != null ? entityManager.getDeclaredEntities() : null; @@ -923,6 +925,7 @@ String encoding = xmlInputSource.getEncoding(); final boolean encodingExternallySpecified = (encoding != null); Boolean isBigEndian = null; + fTempByteBuffer = null; // create reader InputStream stream = null; @@ -1463,6 +1466,7 @@ bufferSize.intValue() > DEFAULT_XMLDECL_BUFFER_SIZE) { fBufferSize = bufferSize.intValue(); fEntityScanner.setBufferSize(fBufferSize); + fByteBufferPool.setBufferSize(fBufferSize); fCharacterBufferPool.setExternalBufferSize(fBufferSize); } } @@ -1884,8 +1888,13 @@ fReaderStack.pop(); } - //Release the character buffer back to the pool for reuse - fCharacterBufferPool.returnToPool(fCurrentEntity.fBuffer); + // Release the character buffer back to the pool for reuse + fCharacterBufferPool.returnBuffer(fCurrentEntity.fCharacterBuffer); + + // Release the byte buffer back to the pool for reuse + if (fCurrentEntity.fByteBuffer != null) { + fByteBufferPool.returnBuffer(fCurrentEntity.fByteBuffer); + } // Pop entity stack. fCurrentEntity = fEntityStack.size() > 0 @@ -2011,7 +2020,10 @@ if (DEBUG_ENCODINGS) { System.out.println("$$$ creating UTF8Reader"); } - return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); + if (fTempByteBuffer == null) { + fTempByteBuffer = fByteBufferPool.getBuffer(); + } + return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); } // try to use an optimized reader @@ -2020,7 +2032,10 @@ if (DEBUG_ENCODINGS) { System.out.println("$$$ creating UTF8Reader"); } - return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); + if (fTempByteBuffer == null) { + fTempByteBuffer = fByteBufferPool.getBuffer(); + } + return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); } if(ENCODING.equals("ISO-10646-UCS-4")) { if(isBigEndian != null) { @@ -2078,9 +2093,10 @@ // try to use a Java reader String javaEncoding = EncodingMap.getIANA2JavaMapping(ENCODING); if (javaEncoding == null) { - if(fAllowJavaEncodings) { - javaEncoding = encoding; - } else { + if (fAllowJavaEncodings) { + javaEncoding = encoding; + } + else { fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN, "EncodingDeclInvalid", new Object[] { encoding }, @@ -2089,20 +2105,29 @@ if (DEBUG_ENCODINGS) { System.out.println("$$$ creating Latin1Reader"); } - return new Latin1Reader(inputStream, fBufferSize); + if (fTempByteBuffer == null) { + fTempByteBuffer = fByteBufferPool.getBuffer(); + } + return new Latin1Reader(inputStream, fTempByteBuffer); } } else if (javaEncoding.equals("ASCII")) { if (DEBUG_ENCODINGS) { System.out.println("$$$ creating ASCIIReader"); } - return new ASCIIReader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); + if (fTempByteBuffer == null) { + fTempByteBuffer = fByteBufferPool.getBuffer(); + } + return new ASCIIReader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale()); } else if (javaEncoding.equals("ISO8859_1")) { if (DEBUG_ENCODINGS) { System.out.println("$$$ creating Latin1Reader"); } - return new Latin1Reader(inputStream, fBufferSize); + if (fTempByteBuffer == null) { + fTempByteBuffer = fByteBufferPool.getBuffer(); + } + return new Latin1Reader(inputStream, fTempByteBuffer); } if (DEBUG_ENCODINGS) { System.out.print("$$$ creating Java InputStreamReader: encoding="+javaEncoding); @@ -2542,9 +2567,11 @@ public boolean mayReadChunks; /** Character buffer container. */ - private CharacterBuffer fBuffer; + private CharacterBuffer fCharacterBuffer; + + /** Byte buffer. */ + private byte [] fByteBuffer; - // // Constructors // @@ -2562,8 +2589,9 @@ this.literal = literal; this.mayReadChunks = mayReadChunks; this.isExternal = isExternal; - this.fBuffer = fCharacterBufferPool.getBuffer(isExternal); - this.ch = fBuffer.ch; + this.fCharacterBuffer = fCharacterBufferPool.getBuffer(isExternal); + this.ch = fCharacterBuffer.ch; + this.fByteBuffer = fTempByteBuffer; } // <init>(StringXMLResourceIdentifier,InputStream,Reader,String,boolean, boolean) // @@ -2581,7 +2609,9 @@ } // isUnparsed():boolean public void setReader(InputStream stream, String encoding, Boolean isBigEndian) throws IOException { + fTempByteBuffer = fByteBuffer; reader = createReader(stream, encoding, isBigEndian); + fByteBuffer = fTempByteBuffer; } // return the expanded system ID of the @@ -2850,7 +2880,7 @@ } /** Returns buffer to pool. **/ - public void returnToPool(CharacterBuffer buffer) { + public void returnBuffer(CharacterBuffer buffer) { if (buffer.isExternal) { if (fExternalTop < fExternalBufferPool.length - 1) { fExternalBufferPool[++fExternalTop] = buffer; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
