Author: yegor
Date: Wed Dec  8 16:53:24 2010
New Revision: 1043517

URL: http://svn.apache.org/viewvc?rev=1043517&view=rev
Log:
 Improved performance of RowRecordsAggregate.getStartRowNumberForBlock / 
getEndRowNumberForBlock, see Bugzilla 47405

Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1043517&r1=1043516&r2=1043517&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Wed Dec  8 16:53:24 
2010
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta1" date="2010-??-??">
+           <action dev="poi-developers" type="add">47405 - Improved 
performance of RowRecordsAggregate.getStartRowNumberForBlock / 
getEndRowNumberForBlock</action>
            <action dev="poi-developers" type="add">50315 - Avoid crashing 
Excel when sorting XSSFSheet autofilter</action>
            <action dev="poi-developers" type="add">50076 - Allow access from 
XSSFReader to sheet comments and headers/footers</action>
            <action dev="poi-developers" type="add">50076 - Refactor 
XSSFEventBasedExcelExtractor to make it easier for you to have control over 
outputting the cell contents</action>

Modified: 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java?rev=1043517&r1=1043516&r2=1043517&view=diff
==============================================================================
--- 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java
 (original)
+++ 
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java
 Wed Dec  8 16:53:24 2010
@@ -54,6 +54,10 @@ public final class RowRecordsAggregate e
        private final List<Record> _unknownRecords;
        private final SharedValueManager _sharedValueManager;
 
+       // Cache values to speed up performance of
+    // getStartRowNumberForBlock / getEndRowNumberForBlock, see Bugzilla 47405
+    private RowRecord[] _rowRecordValues = null;
+
        /** Creates a new instance of ValueRecordsAggregate */
        public RowRecordsAggregate() {
                this(SharedValueManager.createEmpty());
@@ -121,6 +125,8 @@ public final class RowRecordsAggregate e
        public void insertRow(RowRecord row) {
                // Integer integer = Integer.valueOf(row.getRowNumber());
                _rowRecords.put(Integer.valueOf(row.getRowNumber()), row);
+               // Clear the cached values
+               _rowRecordValues = null; 
                if ((row.getRowNumber() < _firstrow) || (_firstrow == -1)) {
                        _firstrow = row.getRowNumber();
                }
@@ -141,6 +147,9 @@ public final class RowRecordsAggregate e
                        _rowRecords.put(key, rr);
                        throw new RuntimeException("Attempt to remove row that 
does not belong to this sheet");
                }
+               
+               // Clear the cached values
+               _rowRecordValues = null;
        }
 
        public RowRecord getRow(int rowIndex) {
@@ -193,22 +202,17 @@ public final class RowRecordsAggregate e
 
        /** Returns the physical row number of the first row in a block*/
        private int getStartRowNumberForBlock(int block) {
-         //Given that we basically iterate through the rows in order,
-         // TODO - For a performance improvement, it would be better to return 
an instance of
-         //an iterator and use that instance throughout, rather than 
recreating one and
-         //having to move it to the right position.
-         int startIndex = block * DBCellRecord.BLOCK_SIZE;
-         Iterator<RowRecord> rowIter = _rowRecords.values().iterator();
-         RowRecord row = null;
-         //Position the iterator at the start of the block
-         for (int i=0; i<=startIndex;i++) {
-               row = rowIter.next();
-         }
-         if (row == null) {
-                 throw new RuntimeException("Did not find start row for block 
" + block);
-         }
+           int startIndex = block * DBCellRecord.BLOCK_SIZE;
 
-         return row.getRowNumber();
+        if(_rowRecordValues == null){
+            _rowRecordValues = _rowRecords.values().toArray(new 
RowRecord[_rowRecords.size()]);
+        }
+
+        try {
+            return _rowRecordValues[startIndex].getRowNumber();
+        } catch(ArrayIndexOutOfBoundsException e) {
+                 throw new RuntimeException("Did not find start row for block 
" + block);
+           }
        }
 
        /** Returns the physical row number of the end row in a block*/
@@ -217,15 +221,15 @@ public final class RowRecordsAggregate e
          if (endIndex >= _rowRecords.size())
                endIndex = _rowRecords.size()-1;
 
-         Iterator<RowRecord> rowIter = _rowRecords.values().iterator();
-         RowRecord row = null;
-         for (int i=0; i<=endIndex;i++) {
-               row = rowIter.next();
-         }
-         if (row == null) {
-                 throw new RuntimeException("Did not find start row for block 
" + block);
+        if(_rowRecordValues == null){
+            _rowRecordValues = _rowRecords.values().toArray(new 
RowRecord[_rowRecords.size()]);
+        }
+
+        try {
+            return _rowRecordValues[endIndex].getRowNumber();
+        } catch(ArrayIndexOutOfBoundsException e) {
+            throw new RuntimeException("Did not find end row for block " + 
block);
          }
-         return row.getRowNumber();
        }
 
        private int visitRowRecordsForBlock(int blockIndex, RecordVisitor rv) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to