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