LUCENE-892: don't do extra buffer-to-buffer copies in CompoundFileReader.CSIndexInput

git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@553269 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael McCandless 2007-07-04 17:00:22 +00:00
parent 39ade207b8
commit 50787ab505
4 changed files with 39 additions and 8 deletions

View File

@ -39,6 +39,9 @@ Optimizations
postings per unique term and is directly flushed into a single postings per unique term and is directly flushed into a single
segment. (Mike McCandless) segment. (Mike McCandless)
3. LUCENE-892: Fixed extra "buffer to buffer copy" that sometimes
takes place when using compound files. (Mike McCandless)
Documentation Documentation
Build Build

View File

@ -237,7 +237,7 @@ class CompoundFileReader extends Directory {
if(start + len > length) if(start + len > length)
throw new IOException("read past EOF"); throw new IOException("read past EOF");
base.seek(fileOffset + start); base.seek(fileOffset + start);
base.readBytes(b, offset, len); base.readBytes(b, offset, len, false);
} }
} }

View File

@ -84,8 +84,13 @@ public abstract class BufferedIndexInput extends IndexInput {
} }
public void readBytes(byte[] b, int offset, int len) throws IOException { public void readBytes(byte[] b, int offset, int len) throws IOException {
readBytes(b, offset, len, true);
}
public void readBytes(byte[] b, int offset, int len, boolean useBuffer) throws IOException {
if(len <= (bufferLength-bufferPosition)){ if(len <= (bufferLength-bufferPosition)){
// the buffer contains enough data to satistfy this request // the buffer contains enough data to satisfy this request
if(len>0) // to allow b to be null if len is 0... if(len>0) // to allow b to be null if len is 0...
System.arraycopy(buffer, bufferPosition, b, offset, len); System.arraycopy(buffer, bufferPosition, b, offset, len);
bufferPosition+=len; bufferPosition+=len;
@ -99,8 +104,9 @@ public abstract class BufferedIndexInput extends IndexInput {
bufferPosition += available; bufferPosition += available;
} }
// and now, read the remaining 'len' bytes: // and now, read the remaining 'len' bytes:
if(len<bufferSize){ if (useBuffer && len<bufferSize){
// If the amount left to read is small enough, do it in the usual // If the amount left to read is small enough, and
// we are allowed to use our buffer, do it in the usual
// buffered way: fill the buffer and copy from it: // buffered way: fill the buffer and copy from it:
refill(); refill();
if(bufferLength<len){ if(bufferLength<len){
@ -112,10 +118,13 @@ public abstract class BufferedIndexInput extends IndexInput {
bufferPosition=len; bufferPosition=len;
} }
} else { } else {
// The amount left to read is larger than the buffer - there's no // The amount left to read is larger than the buffer
// performance reason not to read it all at once. Note that unlike // or we've been asked to not use our buffer -
// the previous code of this function, there is no need to do a seek // there's no performance reason not to read it all
// here, because there's no need to reread what we had in the buffer. // at once. Note that unlike the previous code of
// this function, there is no need to do a seek
// here, because there's no need to reread what we
// had in the buffer.
long after = bufferStart+bufferPosition+len; long after = bufferStart+bufferPosition+len;
if(after > length()) if(after > length())
throw new IOException("read past EOF"); throw new IOException("read past EOF");

View File

@ -40,6 +40,25 @@ public abstract class IndexInput implements Cloneable {
public abstract void readBytes(byte[] b, int offset, int len) public abstract void readBytes(byte[] b, int offset, int len)
throws IOException; throws IOException;
/** Reads a specified number of bytes into an array at the
* specified offset with control over whether the read
* should be buffered (callers who have their own buffer
* should pass in "false" for useBuffer). Currently only
* {@link BufferedIndexInput} respects this parameter.
* @param b the array to read bytes into
* @param offset the offset in the array to start storing bytes
* @param len the number of bytes to read
* @param useBuffer set to false if the caller will handle
* buffering.
* @see IndexOutput#writeBytes(byte[],int)
*/
public void readBytes(byte[] b, int offset, int len, boolean useBuffer)
throws IOException
{
// Default to ignoring useBuffer entirely
readBytes(b, offset, len);
}
/** Reads four bytes and returns an int. /** Reads four bytes and returns an int.
* @see IndexOutput#writeInt(int) * @see IndexOutput#writeInt(int)
*/ */