]> source.dussan.org Git - poi.git/commitdiff
bug 58896: add unit test to time Sheet.autoSizeColumn
authorJaven O'Neal <onealj@apache.org>
Thu, 18 Feb 2016 03:33:25 +0000 (03:33 +0000)
committerJaven O'Neal <onealj@apache.org>
Thu, 18 Feb 2016 03:33:25 +0000 (03:33 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1730997 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/testcases/org/apache/poi/xssf/SXSSFITestDataProvider.java
src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java
src/testcases/org/apache/poi/hssf/HSSFITestDataProvider.java
src/testcases/org/apache/poi/ss/ITestDataProvider.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java

index 04da561e0491e13dd4b95d235072eebec4582032..5b5fe3f4479d19394ba86d3d0665b21efbad0484 100644 (file)
@@ -87,6 +87,14 @@ public final class SXSSFITestDataProvider implements ITestDataProvider {
         return wb;
     }
     
+    //************ SXSSF-specific methods ***************//
+    @Override
+    public SXSSFWorkbook createWorkbook(int rowAccessWindowSize) {
+        SXSSFWorkbook wb = new SXSSFWorkbook(rowAccessWindowSize);
+        instances.add(wb);
+        return wb;
+    }
+    
     @Override
     public void trackColumnsForAutosizing(Sheet sheet, int...columns) {
         for (int cn : columns) {
@@ -94,6 +102,12 @@ public final class SXSSFITestDataProvider implements ITestDataProvider {
         }
     }
     
+    @Override
+    public void trackAllColumnsForAutosizing(Sheet sheet) {
+        ((SXSSFSheet)sheet).trackAllColumnsForAutoSizing();
+    }
+    //************ End SXSSF-specific methods ***************//
+    
     @Override
     public FormulaEvaluator createFormulaEvaluator(Workbook wb) {
         return new XSSFFormulaEvaluator(((SXSSFWorkbook) wb).getXSSFWorkbook());
index ef9e8836f787bbcb7d7c140a105825b6893e5575..b8eb9ebb1ccb624a745624e74cb57fa5ba451b19 100644 (file)
@@ -54,8 +54,17 @@ public final class XSSFITestDataProvider implements ITestDataProvider {
         return new XSSFWorkbook();
     }
     
+    //************ SXSSF-specific methods ***************//
+    @Override
+    public XSSFWorkbook createWorkbook(int rowAccessWindowSize) {
+        return createWorkbook();
+    }
+    
     @Override
     public void trackColumnsForAutosizing(Sheet sheet, int...columns) {}
+    @Override
+    public void trackAllColumnsForAutosizing(Sheet sheet) {}
+    //************ End SXSSF-specific methods ***************//
    
     @Override
     public FormulaEvaluator createFormulaEvaluator(Workbook wb) {
index ffbb828d2c92b1a5eeb1fb20903585e425f0737f..58e6327eb4a908a11ccafb119d1a962357434dcb 100644 (file)
@@ -60,8 +60,17 @@ public final class HSSFITestDataProvider implements ITestDataProvider {
         return new HSSFWorkbook();
     }
     
+    //************ SXSSF-specific methods ***************//
+    @Override
+    public HSSFWorkbook createWorkbook(int rowAccessWindowSize) {
+        return createWorkbook();
+    }
+    
     @Override
     public void trackColumnsForAutosizing(Sheet sheet, int...columns) {}
+    @Override
+    public void trackAllColumnsForAutosizing(Sheet sheet) {}
+    //************ End SXSSF-specific methods ***************//
     
     @Override
     public FormulaEvaluator createFormulaEvaluator(Workbook wb) {
index 4be5d25a2ad8b7a14572763a1e233b1670f69cb7..c88794854e04ce16f80489ad1baed1233faf2cd2 100644 (file)
@@ -47,11 +47,22 @@ public interface ITestDataProvider {
      */
     Workbook createWorkbook();
     
+    
+    //************ SXSSF-specific methods ***************//
+    /**
+     * Provides way of creating a SXSSFWorkbook with a specific row access window size.
+     * Equivalent to createWorkbook on others.
+     * @return an instance of Workbook
+     */
+    Workbook createWorkbook(int rowAccessWindowSize);
+    
     /**
      * Only matters for SXSSF - enables tracking of the column
      *  widths so that autosizing can work. No-op on others.
      */
     void trackColumnsForAutosizing(Sheet sheet, int...columns);
+    void trackAllColumnsForAutosizing(Sheet sheet);
+    //************ End SXSSF-specific methods ***************//
 
     /**
      * Creates the corresponding {@link FormulaEvaluator} for the
index e7860e50d84b39eb170132dddaff68db366cf0a2..e5991adf9adb730622b4ea4196fef0e7006152a4 100644 (file)
@@ -1427,4 +1427,64 @@ public abstract class BaseTestBugzillaIssues {
 
         assertEquals("12-312-345-123", formatter.formatCellValue(cell));
     }
+    
+    @Test
+    public void test58896() throws IOException {
+        final int nrows = 160;
+        final int ncols = 139;
+        final java.io.PrintStream out = System.out;
+        
+        // Create a workbook
+        final Workbook wb = _testDataProvider.createWorkbook(nrows+1);
+        final Sheet sh = wb.createSheet();
+        out.println(wb.getClass().getName() + " column autosizing timing...");
+        
+        final long t0 = time();
+        _testDataProvider.trackAllColumnsForAutosizing(sh);
+        for (int r=0; r<nrows; r++) {
+            final Row row = sh.createRow(r);
+            for (int c=0; c<ncols; c++) {
+                final Cell cell = row.createCell(c);
+                cell.setCellValue("Cell[r="+r+",c="+c+"]");
+            }
+        }
+        final double populateSheetTime = delta(t0);
+        final double populateSheetTimePerCell_ns = (1000000 * populateSheetTime / (nrows*ncols));
+        out.println("Populate sheet time: " + populateSheetTime + " ms (" + populateSheetTimePerCell_ns + " ns/cell)");
+        
+        out.println("\nAutosizing...");
+        final long t1 = time();
+        for (int c=0; c<ncols; c++) {
+            final long t2 = time();
+            sh.autoSizeColumn(c);
+            out.println("Column " + c + " took " + delta(t2) + " ms");
+        }
+        final double autoSizeColumnsTime = delta(t1);
+        final double autoSizeColumnsTimePerColumn = autoSizeColumnsTime / ncols;
+        final double bestFitWidthTimePerCell_ns = 1000000 * autoSizeColumnsTime / (ncols * nrows);
+        
+        out.println("Auto sizing columns took a total of " + autoSizeColumnsTime + " ms (" + autoSizeColumnsTimePerColumn + " ms per column)");
+        out.println("Best fit width time per cell: " + bestFitWidthTimePerCell_ns + " ns");
+        
+        final double totalTime_s = (populateSheetTime + autoSizeColumnsTime) / 1000;
+        out.println("Total time: " + totalTime_s + " s");
+        
+        wb.close();
+        
+        //if (bestFitWidthTimePerCell_ns > 50000) {
+        //    fail("Best fit width time per cell exceeded 50000 ns: " + bestFitWidthTimePerCell_ns + " ns");
+        //}
+        
+        if (totalTime_s > 10) {
+            fail("Total time exceeded 10 seconds: " + totalTime_s + " s");
+        }
+    }
+    
+    public long time() {
+        final long currentTime = System.currentTimeMillis();
+        return currentTime;
+    }
+    public double delta(long startTimeMillis) {
+        return time() - startTimeMillis;
+    }
 }