diff --git a/apache-poi-3/pom.xml b/apache-poi-3/pom.xml index 35584b1dd854..25b3e7fa6073 100644 --- a/apache-poi-3/pom.xml +++ b/apache-poi-3/pom.xml @@ -78,7 +78,17 @@ ch.qos.logback logback-core ${logback-core.version} - + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -90,7 +100,8 @@ 2.6.12 1.12.2 1.5.6 - 1.5.6 + 1.5.6 + 1.37 \ No newline at end of file diff --git a/apache-poi-3/src/main/java/com/baeldung/poi/benchmark/WorkbookBenchmark.java b/apache-poi-3/src/main/java/com/baeldung/poi/benchmark/WorkbookBenchmark.java new file mode 100644 index 000000000000..c557de3cf6f0 --- /dev/null +++ b/apache-poi-3/src/main/java/com/baeldung/poi/benchmark/WorkbookBenchmark.java @@ -0,0 +1,133 @@ +package com.baeldung.poi.benchmark; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.profile.MemPoolProfiler; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 1, time = 2) +@Measurement(iterations = 3, time = 1) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Fork(value = 1) +public class WorkbookBenchmark +{ + + @Benchmark + public static void write2500RowsToHSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new HSSFWorkbook(), 2500, blackhole); + } + + @Benchmark + public static void write5000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new HSSFWorkbook(), 5000, blackhole); + } + + @Benchmark + public static void write10000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new HSSFWorkbook(), 10000, blackhole); + } + + @Benchmark + public static void write20000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new HSSFWorkbook(), 20000, blackhole); + } + + @Benchmark + public static void write40000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new HSSFWorkbook(), 40000, blackhole); + } + + @Benchmark + public static void write2500RowsToXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new XSSFWorkbook(), 2500, blackhole); + } + + @Benchmark + public static void write5000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new XSSFWorkbook(), 5000, blackhole); + } + + @Benchmark + public static void write10000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new XSSFWorkbook(), 10000, blackhole); + } + + @Benchmark + public static void write20000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new XSSFWorkbook(), 20000, blackhole); + } + + @Benchmark + public static void write40000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new XSSFWorkbook(), 40000, blackhole); + } + + @Benchmark + public static void write2500RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new SXSSFWorkbook(), 2500, blackhole); + } + + @Benchmark + public static void write5000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(new SXSSFWorkbook(), 5000, blackhole); + } + + @Benchmark + public static void write10000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(getSXSSFWorkbook(), 10000, blackhole); + } + + @Benchmark + public static void write20000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(getSXSSFWorkbook(), 20000, blackhole); + } + + @Benchmark + public static void write40000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException { + writeRowsToWorkbook(getSXSSFWorkbook(), 40000, blackhole); + } + + private static SXSSFWorkbook getSXSSFWorkbook() { + SXSSFWorkbook workbook = new SXSSFWorkbook(); + workbook.setCompressTempFiles(true); + return workbook; + } + + public static void writeRowsToWorkbook(Workbook workbook, int iterations, Blackhole blackhole) throws IOException { + Sheet sheet = workbook.createSheet(); + for (int n=0;n sheet.autoSizeColumn(0)); + } + + @Test + void whenCloneSheetOnSXSSFWorkbook_thenThrowsIllegalStateException() { + assertThrows(IllegalStateException.class, () -> workbook.cloneSheet(0)); + } + + @Test + void whenEvaluateFormulaCellOnSXSSFWorkbook_thenThrowsIllegalStateException() { + Cell formulaCell = sheet.createRow(sheet.getLastRowNum()).createCell(0); + formulaCell.setCellFormula("SUM(A1:B1)"); + + FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); + assertThrows(SXSSFFormulaEvaluator.RowFlushedException.class, () -> evaluator.evaluateFormulaCell(formulaCell)); + } + + @Test + void whenGetRowOnSXSSFWorkbook_thenReturnNull() { + Row row = sheet.getRow(0); + assertThat(row).isNull(); + } + + @Test + void whenShiftColumnsOnSXSSFWorkbook_thenThrowsUnsupportedOperationException() { + assertThrows(UnsupportedOperationException.class, () -> sheet.shiftColumns(0, 2, 1)); + } + + @AfterEach + void cleanUp() throws IOException { + workbook.close(); + } + +} \ No newline at end of file