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]