poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ye...@apache.org
Subject svn commit: r1043517 - in /poi/trunk/src: documentation/content/xdocs/status.xml java/org/apache/poi/hssf/record/aggregates/RowRecordsAggregate.java
Date Wed, 08 Dec 2010 16:53:24 GMT
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: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message