04/22/2004: POI Optimization - Speeding up org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet()
This setPropertiesFromSheet() method potentially logs a lot of information. The logging calls are expensive because of the objects created when assembling the log messages. Using the check() method of the logging sub-system can prevent object creation when debugging is turned off. This change reduced execution time of my test case by 14.2 seconds and prevented the creation of 781,632 objects.
/** * used internally to set the properties given a Sheet object */ private void setPropertiesFromSheet(Sheet sheet) { long timestart = 0; // only used for debugging. int sloc = sheet.getLoc(); RowRecord row = sheet.getNextRow(); while (row != null) { createRowFromRecord(row); row = sheet.getNextRow(); } sheet.setLoc(sloc); CellValueRecordInterface cval = sheet.getNextValueRecord(); if (log.check(DEBUG)) { timestart = System.currentTimeMillis(); log.log(DEBUG, "Time at start of cell creating in HSSF sheet = ", new Long(timestart)); } HSSFRow lastrow = null; while (cval != null) { long cellstart = System.currentTimeMillis(); HSSFRow hrow = lastrow; if ((lastrow == null) || (lastrow.getRowNum() != cval.getRow())) { hrow = getRow(cval.getRow()); } if (hrow != null) { lastrow = hrow; if (log.check(DEBUG)) { log.log(DEBUG, "record id = " + Integer.toHexString(((Record) cval).getSid())); } hrow.createCellFromRecord(cval); cval = sheet.getNextValueRecord(); if (log.check(DEBUG)) { log.log(DEBUG, "record took ", new Long(System.currentTimeMillis() - cellstart)); } } else { cval = null; } } if (log.check(DEBUG)) { log.log(DEBUG, "total sheet cell creation took ", new Long(System.currentTimeMillis() - timestart)); } }
04/22/2004: POI Optimization - Speeding up org.apache.poi.hssf.record.BlankRecord.compareTo()
This optimization is nearly identical to the one applied to HSSFRow.compareTo()
- just used a local copy
of the row and column values. This change reduced exceution time in my test case by 17.5 seconds.
/** * switched to using a local copy of the row and column. Also moved the equality test to * the last test because it is most complex and probably least likely to be true. */ public int compareTo(Object obj) { int rv = -1; CellValueRecordInterface loc = (CellValueRecordInterface) obj; int thisRow = this.getRow(); int locRow = loc.getRow(); if (thisRow < locRow) { rv = -1; } else if (thisRow > locRow) { rv = 1; } else { int thisColumn = this.getColumn(); int locColumn = loc.getColumn(); if (thisColumn > locColumn) { rv = 1; } else if (thisColumn < locColumn) { rv = -1; } else if ((thisRow == locRow) && (thisColumn == locColumn)) { rv = 0; } } return rv; }