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)); } }