Duh, I didn't even notice we also had an existing ArrayUtilTest....
yes please post a patch!

Mike

On Thu, Jan 21, 2010 at 8:59 AM, Uwe Schindler <u...@thetaphi.de> wrote:
> Somehow we have now both ArrayUtilTest and TestArrayUtil? I think they should 
> be merged and TestArrayUtil as name preferred (as all other tests are named 
> like this).
>
> Should I provide a patch?
>
> -----
> Uwe Schindler
> H.-H.-Meier-Allee 63, D-28213 Bremen
> http://www.thetaphi.de
> eMail: u...@thetaphi.de
>
>
>> -----Original Message-----
>> From: mikemcc...@apache.org [mailto:mikemcc...@apache.org]
>> Sent: Thursday, January 21, 2010 12:55 PM
>> To: java-comm...@lucene.apache.org
>> Subject: svn commit: r901662 - in /lucene/java/trunk:
>> contrib/analyzers/common/src/java/org/tartarus/snowball/
>> contrib/snowball/ contrib/snowball/src/java/org/tartarus/snowball/
>> src/java/org/apache/lucene/analysis/
>> src/java/org/apache/lucene/analysis/tokenattri...
>>
>> Author: mikemccand
>> Date: Thu Jan 21 11:54:50 2010
>> New Revision: 901662
>>
>> URL: http://svn.apache.org/viewvc?rev=901662&view=rev
>> Log:
>> LUCENE-2213: rename ArrayUtil.getNextSize -> oversize; tweak how it
>> picks the next size
>>
>> Added:
>>     lucene/java/trunk/contrib/snowball/
>>       - copied from r900774, lucene/java/trunk/contrib/snowball/
>>
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestArrayUtil.java
>> (with props)
>> Modified:
>>
>> lucene/java/trunk/contrib/analyzers/common/src/java/org/tartarus/snowba
>> ll/SnowballProgram.java
>>
>> lucene/java/trunk/contrib/snowball/src/java/org/tartarus/snowball/Snowb
>> allProgram.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/ASCIIFoldingFilte
>> r.java
>>     lucene/java/trunk/src/java/org/apache/lucene/analysis/Token.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/tokenattributes/T
>> ermAttributeImpl.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldConsumers.ja
>> va
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldProcessorPer
>> Thread.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriter.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/FormatPostingsTermsC
>> onsumer.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/NormsWriterPerField.
>> java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/StoredFieldsWriter.j
>> ava
>>
>> lucene/java/trunk/src/java/org/apache/lucene/index/TermVectorsTermsWrit
>> er.java
>>     lucene/java/trunk/src/java/org/apache/lucene/index/TermsHash.java
>>     lucene/java/trunk/src/java/org/apache/lucene/util/ArrayUtil.java
>>
>> lucene/java/trunk/src/java/org/apache/lucene/util/RamUsageEstimator.jav
>> a
>>
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/TestToken.java
>>
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/tokenattributes/T
>> estTermAttributeImpl.java
>>
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestIndexableBinarySt
>> ringTools.java
>>
>> Modified:
>> lucene/java/trunk/contrib/analyzers/common/src/java/org/tartarus/snowba
>> ll/SnowballProgram.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/contrib/analyzers/common
>> /src/java/org/tartarus/snowball/SnowballProgram.java?rev=901662&r1=9016
>> 61&r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/contrib/analyzers/common/src/java/org/tartarus/snowba
>> ll/SnowballProgram.java (original)
>> +++
>> lucene/java/trunk/contrib/analyzers/common/src/java/org/tartarus/snowba
>> ll/SnowballProgram.java Thu Jan 21 11:54:50 2010
>> @@ -35,6 +35,7 @@
>>  import java.lang.reflect.InvocationTargetException;
>>
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * This is the rev 502 of the Snowball SVN trunk,
>> @@ -432,7 +433,7 @@
>>       final int newLength = limit + adjustment;
>>       //resize if necessary
>>       if (newLength > current.length) {
>> -       char newBuffer[] = new char[ArrayUtil.getNextSize(newLength)];
>> +       char newBuffer[] = new char[ArrayUtil.oversize(newLength,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>         System.arraycopy(current, 0, newBuffer, 0, limit);
>>         current = newBuffer;
>>       }
>>
>> Modified:
>> lucene/java/trunk/contrib/snowball/src/java/org/tartarus/snowball/Snowb
>> allProgram.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/contrib/snowball/src/jav
>> a/org/tartarus/snowball/SnowballProgram.java?rev=901662&r1=900774&r2=90
>> 1662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/contrib/snowball/src/java/org/tartarus/snowball/Snowb
>> allProgram.java (original)
>> +++
>> lucene/java/trunk/contrib/snowball/src/java/org/tartarus/snowball/Snowb
>> allProgram.java Thu Jan 21 11:54:50 2010
>> @@ -35,6 +35,7 @@
>>  import java.lang.reflect.InvocationTargetException;
>>
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * This is the rev 502 of the Snowball SVN trunk,
>> @@ -432,7 +433,7 @@
>>       final int newLength = limit + adjustment;
>>       //resize if necessary
>>       if (newLength > current.length) {
>> -       char newBuffer[] = new char[ArrayUtil.getNextSize(newLength)];
>> +       char newBuffer[] = new char[ArrayUtil.oversize(newLength,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>         System.arraycopy(current, 0, newBuffer, 0, limit);
>>         current = newBuffer;
>>       }
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/ASCIIFoldingFilte
>> r.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/analysis/ASCIIFoldingFilter.java?rev=901662&r1=901661&r2=901662&view
>> =diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/ASCIIFoldingFilte
>> r.java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/ASCIIFoldingFilte
>> r.java Thu Jan 21 11:54:50 2010
>> @@ -1,10 +1,5 @@
>>  package org.apache.lucene.analysis;
>>
>> -import java.io.IOException;
>> -
>> -import org.apache.lucene.analysis.tokenattributes.TermAttribute;
>> -import org.apache.lucene.util.ArrayUtil;
>> -
>>  /**
>>   * Licensed to the Apache Software Foundation (ASF) under one or more
>>   * contributor license agreements.  See the NOTICE file distributed
>> with
>> @@ -22,6 +17,12 @@
>>   * limitations under the License.
>>   */
>>
>> +import java.io.IOException;
>> +
>> +import org.apache.lucene.analysis.tokenattributes.TermAttribute;
>> +import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>> +
>>  /**
>>   * This class converts alphabetic, numeric, and symbolic Unicode
>> characters
>>   * which are not in the first 127 ASCII characters (the "Basic Latin"
>> Unicode
>> @@ -101,7 +102,7 @@
>>      // Worst-case length required:
>>      final int maxSizeNeeded = 4 * length;
>>      if (output.length < maxSizeNeeded) {
>> -      output = new char[ArrayUtil.getNextSize(maxSizeNeeded)];
>> +      output = new char[ArrayUtil.oversize(maxSizeNeeded,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      }
>>
>>      outputPos = 0;
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/Token.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/analysis/Token.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> --- lucene/java/trunk/src/java/org/apache/lucene/analysis/Token.java
>> (original)
>> +++ lucene/java/trunk/src/java/org/apache/lucene/analysis/Token.java
>> Thu Jan 21 11:54:50 2010
>> @@ -29,6 +29,7 @@
>>  import org.apache.lucene.util.Attribute;
>>  import org.apache.lucene.util.AttributeSource;
>>  import org.apache.lucene.util.AttributeImpl;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>    A Token is an occurrence of a term from the text of a field.  It
>> consists of
>> @@ -347,12 +348,12 @@
>>    public char[] resizeTermBuffer(int newSize) {
>>      if (termBuffer == null) {
>>        // The buffer is always at least MIN_BUFFER_SIZE
>> -      termBuffer = new char[ArrayUtil.getNextSize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize)];
>> +      termBuffer = new char[ArrayUtil.oversize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      } else {
>>        if(termBuffer.length < newSize){
>>          // Not big enough; create a new array with slight
>>          // over allocation and preserve content
>> -        final char[] newCharBuffer = new
>> char[ArrayUtil.getNextSize(newSize)];
>> +        final char[] newCharBuffer = new
>> char[ArrayUtil.oversize(newSize, RamUsageEstimator.NUM_BYTES_CHAR)];
>>          System.arraycopy(termBuffer, 0, newCharBuffer, 0,
>> termBuffer.length);
>>          termBuffer = newCharBuffer;
>>        }
>> @@ -367,19 +368,19 @@
>>    private void growTermBuffer(int newSize) {
>>      if (termBuffer == null) {
>>        // The buffer is always at least MIN_BUFFER_SIZE
>> -      termBuffer = new char[ArrayUtil.getNextSize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize)];
>> +      termBuffer = new char[ArrayUtil.oversize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      } else {
>>        if(termBuffer.length < newSize){
>>          // Not big enough; create a new array with slight
>>          // over allocation:
>> -        termBuffer = new char[ArrayUtil.getNextSize(newSize)];
>> +        termBuffer = new char[ArrayUtil.oversize(newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        }
>>      }
>>    }
>>
>>    private void initTermBuffer() {
>>      if (termBuffer == null) {
>> -      termBuffer = new char[ArrayUtil.getNextSize(MIN_BUFFER_SIZE)];
>> +      termBuffer = new char[ArrayUtil.oversize(MIN_BUFFER_SIZE,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        termLength = 0;
>>      }
>>    }
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/tokenattributes/T
>> ermAttributeImpl.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/analysis/tokenattributes/TermAttributeImpl.java?rev=901662&r1=901661
>> &r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/tokenattributes/T
>> ermAttributeImpl.java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/analysis/tokenattributes/T
>> ermAttributeImpl.java Thu Jan 21 11:54:50 2010
>> @@ -21,6 +21,7 @@
>>
>>  import org.apache.lucene.util.ArrayUtil;
>>  import org.apache.lucene.util.AttributeImpl;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * The term text of a Token.
>> @@ -106,12 +107,12 @@
>>    public char[] resizeTermBuffer(int newSize) {
>>      if (termBuffer == null) {
>>        // The buffer is always at least MIN_BUFFER_SIZE
>> -      termBuffer = new char[ArrayUtil.getNextSize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize)];
>> +      termBuffer = new char[ArrayUtil.oversize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      } else {
>>        if(termBuffer.length < newSize){
>>          // Not big enough; create a new array with slight
>>          // over allocation and preserve content
>> -        final char[] newCharBuffer = new
>> char[ArrayUtil.getNextSize(newSize)];
>> +        final char[] newCharBuffer = new
>> char[ArrayUtil.oversize(newSize, RamUsageEstimator.NUM_BYTES_CHAR)];
>>          System.arraycopy(termBuffer, 0, newCharBuffer, 0,
>> termBuffer.length);
>>          termBuffer = newCharBuffer;
>>        }
>> @@ -127,19 +128,19 @@
>>    private void growTermBuffer(int newSize) {
>>      if (termBuffer == null) {
>>        // The buffer is always at least MIN_BUFFER_SIZE
>> -      termBuffer = new char[ArrayUtil.getNextSize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize)];
>> +      termBuffer = new char[ArrayUtil.oversize(newSize <
>> MIN_BUFFER_SIZE ? MIN_BUFFER_SIZE : newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      } else {
>>        if(termBuffer.length < newSize){
>>          // Not big enough; create a new array with slight
>>          // over allocation:
>> -        termBuffer = new char[ArrayUtil.getNextSize(newSize)];
>> +        termBuffer = new char[ArrayUtil.oversize(newSize,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        }
>>      }
>>    }
>>
>>    private void initTermBuffer() {
>>      if (termBuffer == null) {
>> -      termBuffer = new char[ArrayUtil.getNextSize(MIN_BUFFER_SIZE)];
>> +      termBuffer = new char[ArrayUtil.oversize(MIN_BUFFER_SIZE,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        termLength = 0;
>>      }
>>    }
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldConsumers.ja
>> va
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/DocFieldConsumers.java?rev=901662&r1=901661&r2=901662&view=dif
>> f
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldConsumers.ja
>> va (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldConsumers.ja
>> va Thu Jan 21 11:54:50 2010
>> @@ -25,6 +25,7 @@
>>  import java.io.IOException;
>>
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /** This is just a "splitter" class: it lets you wrap two
>>   *  DocFieldConsumer instances as a single consumer. */
>> @@ -117,7 +118,7 @@
>>          // enough space to recycle all outstanding PerDoc
>>          // instances
>>          assert allocCount == 1+docFreeList.length;
>> -        docFreeList = new PerDoc[ArrayUtil.getNextSize(allocCount)];
>> +        docFreeList = new PerDoc[ArrayUtil.oversize(allocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>        }
>>        return new PerDoc();
>>      } else
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldProcessorPer
>> Thread.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/DocFieldProcessorPerThread.java?rev=901662&r1=901661&r2=901662
>> &view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldProcessorPer
>> Thread.java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocFieldProcessorPer
>> Thread.java Thu Jan 21 11:54:50 2010
>> @@ -24,6 +24,7 @@
>>  import org.apache.lucene.document.Document;
>>  import org.apache.lucene.document.Fieldable;
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * Gathers all Fieldables for a document under the same
>> @@ -340,7 +341,7 @@
>>          // enough space to recycle all outstanding PerDoc
>>          // instances
>>          assert allocCount == 1+docFreeList.length;
>> -        docFreeList = new PerDoc[ArrayUtil.getNextSize(allocCount)];
>> +        docFreeList = new PerDoc[ArrayUtil.oversize(allocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>        }
>>        return new PerDoc();
>>      } else
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriter.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/DocumentsWriter.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriter.java
>> (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/DocumentsWriter.java
>> Thu Jan 21 11:54:50 2010
>> @@ -40,6 +40,7 @@
>>  import org.apache.lucene.util.ArrayUtil;
>>  import org.apache.lucene.util.Constants;
>>  import org.apache.lucene.util.ThreadInterruptedException;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * This class accepts multiple added documents and directly
>> @@ -1503,7 +1504,7 @@
>>          int gap = doc.docID - nextWriteDocID;
>>          if (gap >= waiting.length) {
>>            // Grow queue
>> -          DocWriter[] newArray = new
>> DocWriter[ArrayUtil.getNextSize(gap)];
>> +          DocWriter[] newArray = new DocWriter[ArrayUtil.oversize(gap,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>            assert nextWriteLoc >= 0;
>>            System.arraycopy(waiting, nextWriteLoc, newArray, 0,
>> waiting.length-nextWriteLoc);
>>            System.arraycopy(waiting, 0, newArray, waiting.length-
>> nextWriteLoc, nextWriteLoc);
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/FormatPostingsTermsC
>> onsumer.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/FormatPostingsTermsConsumer.java?rev=901662&r1=901661&r2=90166
>> 2&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/FormatPostingsTermsC
>> onsumer.java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/FormatPostingsTermsC
>> onsumer.java Thu Jan 21 11:54:50 2010
>> @@ -20,6 +20,7 @@
>>  import java.io.IOException;
>>
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /**
>>   * NOTE: this API is experimental and will likely change
>> @@ -35,7 +36,7 @@
>>    FormatPostingsDocsConsumer addTerm(String text) throws IOException {
>>      final int len = text.length();
>>      if (termBuffer == null || termBuffer.length < 1+len)
>> -      termBuffer = new char[ArrayUtil.getNextSize(1+len)];
>> +      termBuffer = new char[ArrayUtil.oversize(1+len,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>      text.getChars(0, len, termBuffer, 0);
>>      termBuffer[len] = 0xffff;
>>      return addTerm(termBuffer, 0);
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/NormsWriterPerField.
>> java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/NormsWriterPerField.java?rev=901662&r1=901661&r2=901662&view=d
>> iff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/NormsWriterPerField.
>> java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/NormsWriterPerField.
>> java Thu Jan 21 11:54:50 2010
>> @@ -63,11 +63,13 @@
>>
>>   �...@override
>>    void finish() {
>> -    assert docIDs.length == norms.length;
>>      if (fieldInfo.isIndexed && !fieldInfo.omitNorms) {
>>        if (docIDs.length <= upto) {
>>          assert docIDs.length == upto;
>>          docIDs = ArrayUtil.grow(docIDs, 1+upto);
>> +      }
>> +      if (norms.length <= upto) {
>> +        assert norms.length == upto;
>>          norms = ArrayUtil.grow(norms, 1+upto);
>>        }
>>        final float norm =
>> docState.similarity.computeNorm(fieldInfo.name, fieldState);
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/StoredFieldsWriter.j
>> ava
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/StoredFieldsWriter.java?rev=901662&r1=901661&r2=901662&view=di
>> ff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/StoredFieldsWriter.j
>> ava (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/StoredFieldsWriter.j
>> ava Thu Jan 21 11:54:50 2010
>> @@ -20,6 +20,7 @@
>>  import java.io.IOException;
>>  import org.apache.lucene.store.RAMOutputStream;
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /** This is a DocFieldConsumer that writes stored fields. */
>>  final class StoredFieldsWriter {
>> @@ -108,7 +109,7 @@
>>          // enough space to recycle all outstanding PerDoc
>>          // instances
>>          assert allocCount == 1+docFreeList.length;
>> -        docFreeList = new PerDoc[ArrayUtil.getNextSize(allocCount)];
>> +        docFreeList = new PerDoc[ArrayUtil.oversize(allocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>        }
>>        return new PerDoc();
>>      } else
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/TermVectorsTermsWrit
>> er.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/TermVectorsTermsWriter.java?rev=901662&r1=901661&r2=901662&vie
>> w=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/index/TermVectorsTermsWrit
>> er.java (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/index/TermVectorsTermsWrit
>> er.java Thu Jan 21 11:54:50 2010
>> @@ -20,6 +20,7 @@
>>  import org.apache.lucene.store.IndexOutput;
>>  import org.apache.lucene.store.RAMOutputStream;
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  import java.io.IOException;
>>  import java.util.Collection;
>> @@ -117,7 +118,7 @@
>>          // enough space to recycle all outstanding PerDoc
>>          // instances
>>          assert allocCount == 1+docFreeList.length;
>> -        docFreeList = new PerDoc[ArrayUtil.getNextSize(allocCount)];
>> +        docFreeList = new PerDoc[ArrayUtil.oversize(allocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>        }
>>        return new PerDoc();
>>      } else
>> @@ -266,6 +267,8 @@
>>      void addField(final int fieldNumber) {
>>        if (numVectorFields == fieldNumbers.length) {
>>          fieldNumbers = ArrayUtil.grow(fieldNumbers);
>> +      }
>> +      if (numVectorFields == fieldPointers.length) {
>>          fieldPointers = ArrayUtil.grow(fieldPointers);
>>        }
>>        fieldNumbers[numVectorFields] = fieldNumber;
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/index/TermsHash.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/index/TermsHash.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> --- lucene/java/trunk/src/java/org/apache/lucene/index/TermsHash.java
>> (original)
>> +++ lucene/java/trunk/src/java/org/apache/lucene/index/TermsHash.java
>> Thu Jan 21 11:54:50 2010
>> @@ -26,6 +26,7 @@
>>  import java.io.IOException;
>>
>>  import org.apache.lucene.util.ArrayUtil;
>> +import org.apache.lucene.util.RamUsageEstimator;
>>
>>  /** This class implements {...@link InvertedDocConsumer}, which
>>   *  is passed each token produced by the analyzer on each
>> @@ -89,7 +90,7 @@
>>
>>      assert postingsFreeCount == postingsAllocCount:
>> Thread.currentThread().getName() + ": postingsFreeCount=" +
>> postingsFreeCount + " postingsAllocCount=" + postingsAllocCount + "
>> consumer=" + consumer;
>>
>> -    final int newSize =
>> ArrayUtil.getShrinkSize(postingsFreeList.length, postingsAllocCount);
>> +    final int newSize =
>> ArrayUtil.getShrinkSize(postingsFreeList.length, postingsAllocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF);
>>      if (newSize != postingsFreeList.length) {
>>        RawPostingList[] newArray = new RawPostingList[newSize];
>>        System.arraycopy(postingsFreeList, 0, newArray, 0,
>> postingsFreeCount);
>> @@ -222,7 +223,7 @@
>>        if (newPostingsAllocCount > postingsFreeList.length)
>>          // Pre-allocate the postingsFreeList so it's large
>>          // enough to hold all postings we've given out
>> -        postingsFreeList = new
>> RawPostingList[ArrayUtil.getNextSize(newPostingsAllocCount)];
>> +        postingsFreeList = new
>> RawPostingList[ArrayUtil.oversize(newPostingsAllocCount,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF)];
>>      }
>>
>>      postingsFreeCount -= numToCopy;
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/util/ArrayUtil.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/util/ArrayUtil.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> --- lucene/java/trunk/src/java/org/apache/lucene/util/ArrayUtil.java
>> (original)
>> +++ lucene/java/trunk/src/java/org/apache/lucene/util/ArrayUtil.java
>> Thu Jan 21 11:54:50 2010
>> @@ -7,9 +7,9 @@
>>   * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>>   * (the "License"); you may not use this file except in compliance
>> with
>>   * the License.  You may obtain a copy of the License at
>> - * <p/>
>> - * http://www.apache.org/licenses/LICENSE-2.0
>> - * <p/>
>> + *
>> + *     http://www.apache.org/licenses/LICENSE-2.0
>> + *
>>   * Unless required by applicable law or agreed to in writing, software
>>   * distributed under the License is distributed on an "AS IS" BASIS,
>>   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> @@ -122,20 +122,95 @@
>>   END APACHE HARMONY CODE
>>    */
>>
>> +  /** Returns an array size >= minTargetSize, generally
>> +   *  over-allocating exponentially to achieve amortized
>> +   *  linear-time cost as the array grows.
>> +   *
>> +   *  NOTE: this was originally borrowed from Python 2.4.2
>> +   *  listobject.c sources (attribution in LICENSE.txt), but
>> +   *  has now been substantially changed based on
>> +   *  discussions from java-dev thread with subject "Dynamic
>> +   *  array reallocation algorithms", started on Jan 12
>> +   *  2010.
>> +   *
>> +   * @param minTargetSize Minimum required value to be returned.
>> +   * @param bytesPerElement Bytes used by each element of
>> +   * the array.  See constants in {...@link RamUsageEstimator}.
>> +   *
>> +   * @lucene.internal
>> +   */
>> +
>> +  public static int oversize(int minTargetSize, int bytesPerElement) {
>> +
>> +    if (minTargetSize < 0) {
>> +      // catch usage that accidentally overflows int
>> +      throw new IllegalArgumentException("invalid array size " +
>> minTargetSize);
>> +    }
>> +
>> +    if (minTargetSize == 0) {
>> +      // wait until at least one element is requested
>> +      return 0;
>> +    }
>>
>> -  public static int getNextSize(int targetSize) {
>> -    /* This over-allocates proportional to the list size, making room
>> -     * for additional growth.  The over-allocation is mild, but is
>> -     * enough to give linear-time amortized behavior over a long
>> -     * sequence of appends() in the presence of a poorly-performing
>> -     * system realloc().
>> -     * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88,
>> ...
>> -     */
>> -    return (targetSize >> 3) + (targetSize < 9 ? 3 : 6) + targetSize;
>> +    // asymptotic exponential growth by 1/8th, favors
>> +    // spending a bit more CPU to not tye up too much wasted
>> +    // RAM:
>> +    int extra = minTargetSize >> 3;
>> +
>> +    if (extra < 3) {
>> +      // for very small arrays, where constant overhead of
>> +      // realloc is presumably relatively high, we grow
>> +      // faster
>> +      extra = 3;
>> +    }
>> +
>> +    int newSize = minTargetSize + extra;
>> +
>> +    // add 7 to allow for worst case byte alignment addition below:
>> +    if (newSize+7 < 0) {
>> +      // int overflowed -- return max allowed array size
>> +      return Integer.MAX_VALUE;
>> +    }
>> +
>> +    if (Constants.JRE_IS_64BIT) {
>> +      // round up to 8 byte alignment in 64bit env
>> +      switch(bytesPerElement) {
>> +      case 4:
>> +        // round up to multiple of 2
>> +        return (newSize + 1) & 0x7ffffffe;
>> +      case 2:
>> +        // round up to multiple of 4
>> +        return (newSize + 3) & 0x7ffffffc;
>> +      case 1:
>> +        // round up to multiple of 8
>> +        return (newSize + 7) & 0x7ffffff8;
>> +      case 8:
>> +        // no rounding
>> +      default:
>> +        // odd (invalid?) size
>> +        return newSize;
>> +      }
>> +    } else {
>> +      // round up to 4 byte alignment in 64bit env
>> +      switch(bytesPerElement) {
>> +      case 2:
>> +        // round up to multiple of 2
>> +        return (newSize + 1) & 0x7ffffffe;
>> +      case 1:
>> +        // round up to multiple of 4
>> +        return (newSize + 3) & 0x7ffffffc;
>> +      case 4:
>> +      case 8:
>> +        // no rounding
>> +      default:
>> +        // odd (invalid?) size
>> +        return newSize;
>> +      }
>> +    }
>>    }
>>
>> -  public static int getShrinkSize(int currentSize, int targetSize) {
>> -    final int newSize = getNextSize(targetSize);
>> +  public static int getShrinkSize(int currentSize, int targetSize, int
>> bytesPerElement) {
>> +    final int newSize = oversize(targetSize, bytesPerElement);
>>      // Only reallocate if we are "substantially" smaller.
>>      // This saves us from "running hot" (constantly making a
>>      // bit bigger then a bit smaller, over and over):
>> @@ -147,7 +222,7 @@
>>
>>    public static int[] grow(int[] array, int minSize) {
>>      if (array.length < minSize) {
>> -      int[] newArray = new int[getNextSize(minSize)];
>> +      int[] newArray = new int[oversize(minSize,
>> RamUsageEstimator.NUM_BYTES_INT)];
>>        System.arraycopy(array, 0, newArray, 0, array.length);
>>        return newArray;
>>      } else
>> @@ -159,7 +234,7 @@
>>    }
>>
>>    public static int[] shrink(int[] array, int targetSize) {
>> -    final int newSize = getShrinkSize(array.length, targetSize);
>> +    final int newSize = getShrinkSize(array.length, targetSize,
>> RamUsageEstimator.NUM_BYTES_INT);
>>      if (newSize != array.length) {
>>        int[] newArray = new int[newSize];
>>        System.arraycopy(array, 0, newArray, 0, newSize);
>> @@ -170,7 +245,7 @@
>>
>>    public static long[] grow(long[] array, int minSize) {
>>      if (array.length < minSize) {
>> -      long[] newArray = new long[getNextSize(minSize)];
>> +      long[] newArray = new long[oversize(minSize,
>> RamUsageEstimator.NUM_BYTES_LONG)];
>>        System.arraycopy(array, 0, newArray, 0, array.length);
>>        return newArray;
>>      } else
>> @@ -182,7 +257,7 @@
>>    }
>>
>>    public static long[] shrink(long[] array, int targetSize) {
>> -    final int newSize = getShrinkSize(array.length, targetSize);
>> +    final int newSize = getShrinkSize(array.length, targetSize,
>> RamUsageEstimator.NUM_BYTES_LONG);
>>      if (newSize != array.length) {
>>        long[] newArray = new long[newSize];
>>        System.arraycopy(array, 0, newArray, 0, newSize);
>> @@ -193,7 +268,7 @@
>>
>>    public static byte[] grow(byte[] array, int minSize) {
>>      if (array.length < minSize) {
>> -      byte[] newArray = new byte[getNextSize(minSize)];
>> +      byte[] newArray = new byte[oversize(minSize, 1)];
>>        System.arraycopy(array, 0, newArray, 0, array.length);
>>        return newArray;
>>      } else
>> @@ -205,7 +280,7 @@
>>    }
>>
>>    public static byte[] shrink(byte[] array, int targetSize) {
>> -    final int newSize = getShrinkSize(array.length, targetSize);
>> +    final int newSize = getShrinkSize(array.length, targetSize, 1);
>>      if (newSize != array.length) {
>>        byte[] newArray = new byte[newSize];
>>        System.arraycopy(array, 0, newArray, 0, newSize);
>>
>> Modified:
>> lucene/java/trunk/src/java/org/apache/lucene/util/RamUsageEstimator.jav
>> a
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/luce
>> ne/util/RamUsageEstimator.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/java/org/apache/lucene/util/RamUsageEstimator.jav
>> a (original)
>> +++
>> lucene/java/trunk/src/java/org/apache/lucene/util/RamUsageEstimator.jav
>> a Thu Jan 21 11:54:50 2010
>> @@ -43,6 +43,14 @@
>>    private int arraySize;
>>    private int classSize;
>>
>> +  public final static int NUM_BYTES_OBJECT_REF =
>> Constants.JRE_IS_64BIT ? 8 : 4;
>> +  public final static int NUM_BYTES_CHAR = 2;
>> +  public final static int NUM_BYTES_SHORT = 2;
>> +  public final static int NUM_BYTES_INT = 4;
>> +  public final static int NUM_BYTES_LONG = 8;
>> +  public final static int NUM_BYTES_FLOAT = 4;
>> +  public final static int NUM_BYTES_DOUBLE = 8;
>> +
>>    private boolean checkInterned;
>>
>>    /**
>>
>> Modified:
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/TestToken.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/luce
>> ne/analysis/TestToken.java?rev=901662&r1=901661&r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/TestToken.java
>> (original)
>> +++
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/TestToken.java
>> Thu Jan 21 11:54:50 2010
>> @@ -85,7 +85,6 @@
>>        buf.append(buf.toString());
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // now as a string, first variant
>>      t = new Token();
>> @@ -99,7 +98,6 @@
>>        buf.append(content);
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // now as a string, second variant
>>      t = new Token();
>> @@ -113,7 +111,6 @@
>>        buf.append(content);
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // Test for slow growth to a long term
>>      t = new Token();
>> @@ -127,7 +124,6 @@
>>        buf.append("a");
>>      }
>>      assertEquals(20000, t.termLength());
>> -    assertEquals(20167, t.termBuffer().length);
>>
>>      // Test for slow growth to a long term
>>      t = new Token();
>> @@ -141,7 +137,6 @@
>>        buf.append("a");
>>      }
>>      assertEquals(20000, t.termLength());
>> -    assertEquals(20167, t.termBuffer().length);
>>    }
>>
>>    public void testToString() throws Exception {
>>
>> Modified:
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/tokenattributes/T
>> estTermAttributeImpl.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/luce
>> ne/analysis/tokenattributes/TestTermAttributeImpl.java?rev=901662&r1=90
>> 1661&r2=901662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/tokenattributes/T
>> estTermAttributeImpl.java (original)
>> +++
>> lucene/java/trunk/src/test/org/apache/lucene/analysis/tokenattributes/T
>> estTermAttributeImpl.java Thu Jan 21 11:54:50 2010
>> @@ -49,7 +49,6 @@
>>        buf.append(buf.toString());
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // now as a string, first variant
>>      t = new TermAttributeImpl();
>> @@ -63,7 +62,6 @@
>>        buf.append(content);
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // now as a string, second variant
>>      t = new TermAttributeImpl();
>> @@ -77,7 +75,6 @@
>>        buf.append(content);
>>      }
>>      assertEquals(1048576, t.termLength());
>> -    assertEquals(1179654, t.termBuffer().length);
>>
>>      // Test for slow growth to a long term
>>      t = new TermAttributeImpl();
>> @@ -91,7 +88,6 @@
>>        buf.append("a");
>>      }
>>      assertEquals(20000, t.termLength());
>> -    assertEquals(20167, t.termBuffer().length);
>>
>>      // Test for slow growth to a long term
>>      t = new TermAttributeImpl();
>> @@ -105,7 +101,6 @@
>>        buf.append("a");
>>      }
>>      assertEquals(20000, t.termLength());
>> -    assertEquals(20167, t.termBuffer().length);
>>    }
>>
>>    public void testToString() throws Exception {
>>
>> Added:
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestArrayUtil.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/luce
>> ne/util/TestArrayUtil.java?rev=901662&view=auto
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestArrayUtil.java
>> (added)
>> +++
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestArrayUtil.java
>> Thu Jan 21 11:54:50 2010
>> @@ -0,0 +1,59 @@
>> +package org.apache.lucene.util;
>> +
>> +/**
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed
>> with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance
>> with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *     http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + * See the License for the specific language governing permissions and
>> + * limitations under the License.
>> + */
>> +
>> +import java.util.Random;
>> +
>> +public class TestArrayUtil extends LuceneTestCase {
>> +
>> +  // Ensure ArrayUtil.getNextSize gives linear amortized cost of
>> realloc/copy
>> +  public void testGrowth() {
>> +    int currentSize = 0;
>> +    long copyCost = 0;
>> +
>> +    // Make sure ArrayUtil hits Integer.MAX_VALUE, if we insist:
>> +    while(currentSize != Integer.MAX_VALUE) {
>> +      int nextSize = ArrayUtil.oversize(1+currentSize,
>> RamUsageEstimator.NUM_BYTES_OBJECT_REF);
>> +      assertTrue(nextSize > currentSize);
>> +      if (currentSize > 0) {
>> +        copyCost += currentSize;
>> +        double copyCostPerElement = ((double) copyCost)/currentSize;
>> +        assertTrue("cost " + copyCostPerElement, copyCostPerElement <
>> 10.0);
>> +      }
>> +      currentSize = nextSize;
>> +    }
>> +  }
>> +
>> +  public void testMaxSize() {
>> +    // intentionally pass invalid elemSizes:
>> +    for(int elemSize=0;elemSize<10;elemSize++) {
>> +      assertEquals(Integer.MAX_VALUE,
>> ArrayUtil.oversize(Integer.MAX_VALUE, elemSize));
>> +      assertEquals(Integer.MAX_VALUE,
>> ArrayUtil.oversize(Integer.MAX_VALUE-1, elemSize));
>> +    }
>> +  }
>> +
>> +  public void testInvalidElementSizes() {
>> +    final Random r = newRandom();
>> +    for(int iter=0;iter<10000;iter++) {
>> +      final int minTargetSize = r.nextInt(Integer.MAX_VALUE);
>> +      final int elemSize = r.nextInt(11);
>> +      final int v = ArrayUtil.oversize(minTargetSize, elemSize);
>> +      assertTrue(v >= minTargetSize);
>> +    }
>> +  }
>> +}
>>
>> Propchange:
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestArrayUtil.java
>> -----------------------------------------------------------------------
>> -------
>>     svn:eol-style = native
>>
>> Modified:
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestIndexableBinarySt
>> ringTools.java
>> URL:
>> http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/luce
>> ne/util/TestIndexableBinaryStringTools.java?rev=901662&r1=901661&r2=901
>> 662&view=diff
>> =======================================================================
>> =======
>> ---
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestIndexableBinarySt
>> ringTools.java (original)
>> +++
>> lucene/java/trunk/src/test/org/apache/lucene/util/TestIndexableBinarySt
>> ringTools.java Thu Jan 21 11:54:50 2010
>> @@ -164,14 +164,14 @@
>>        int encodedLen1 = IndexableBinaryStringTools.getEncodedLength(
>>            originalArray1, 0, numBytes1);
>>        if (encodedLen1 > encoded1.length)
>> -        encoded1 = new char[ArrayUtil.getNextSize(encodedLen1)];
>> +        encoded1 = new char[ArrayUtil.oversize(encodedLen1,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        IndexableBinaryStringTools.encode(originalArray1, 0, numBytes1,
>> encoded1,
>>            0, encodedLen1);
>>
>>        int encodedLen2 =
>> IndexableBinaryStringTools.getEncodedLength(original2,
>>            0, numBytes2);
>>        if (encodedLen2 > encoded2.length)
>> -        encoded2 = new char[ArrayUtil.getNextSize(encodedLen2)];
>> +        encoded2 = new char[ArrayUtil.oversize(encodedLen2,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        IndexableBinaryStringTools.encode(original2, 0, numBytes2,
>> encoded2, 0,
>>            encodedLen2);
>>
>> @@ -308,7 +308,7 @@
>>        int encodedLen =
>> IndexableBinaryStringTools.getEncodedLength(binary, 0,
>>            numBytes);
>>        if (encoded.length < encodedLen)
>> -        encoded = new char[ArrayUtil.getNextSize(encodedLen)];
>> +        encoded = new char[ArrayUtil.oversize(encodedLen,
>> RamUsageEstimator.NUM_BYTES_CHAR)];
>>        IndexableBinaryStringTools.encode(binary, 0, numBytes, encoded,
>> 0,
>>            encodedLen);
>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-dev-unsubscr...@lucene.apache.org
> For additional commands, e-mail: java-dev-h...@lucene.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-dev-h...@lucene.apache.org

Reply via email to