NPOI 导出 excel 性能测试
程序员文章站
2022-06-13 08:23:38
网上看到很多人说 NPOI 的性能不行,自己写了一个 NPOI 的扩展库,于是想尝试看看 NPOI 的性能究竟怎么样,道听途说始终不如自己动手一试。 ......
npoi 导出 excel 性能测试
intro
网上看到很多人说 npoi 的性能不行,自己写了一个 npoi 的扩展库,于是想尝试看看 npoi 的性能究竟怎么样,道听途说始终不如自己动手一试。
测试环境
测试工具:
- benchmarkdotnet v0.11.5
- epplus.core.extensions v2.3.2
- epplus v4.5.3.1
- npoi 2.4.1
测试代码:(github 源码)
[simplejob(launchcount: 1, warmupcount: 1, targetcount: 5)] [memorydiagnoser] [mincolumn, maxcolumn, meancolumn, mediancolumn] public class workbookbasictest { private const int colscount = 10; [params(10000, 30000, 50000, 65535)] public int rowscount; [benchmark(baseline = true)] public byte[] npoixlsworkbookinit() { var workbook = excelhelper.prepareworkbook(excelformat.xls); var sheet = workbook.createsheet("tempsheet"); for (var i = 0; i < rowscount; i++) { var row = sheet.createrow(i); for (var j = 0; j < colscount; j++) { var cell = row.createcell(j); cell.setcellvalue($"as ({i}, {j}) sa"); } } return workbook.toexcelbytes(); } [benchmark] [methodimpl(methodimploptions.noinlining)] public byte[] npoixlsxworkbookinit() { var workbook = excelhelper.prepareworkbook(excelformat.xlsx); var sheet = workbook.createsheet("tempsheet"); for (var i = 0; i < rowscount; i++) { var row = sheet.createrow(i); for (var j = 0; j < colscount; j++) { var cell = row.createcell(j); cell.setcellvalue($"as ({i}, {j}) sa"); } } return workbook.toexcelbytes(); } [benchmark] [methodimpl(methodimploptions.noinlining)] public byte[] epplusworkbookinit() { var excel = new excelpackage(); var sheet = excel.workbook.worksheets.add("tempsheet"); for (var i = 1; i <= rowscount; i++) { for (var j = 1; j <= colscount; j++) { sheet.cells[i, j].value = $"as ({i}, {j}) sa"; } } return excel.getasbytearray(); } }
测试结果
benchmarkdotnet=v0.11.5, os=windows 10.0.18362 intel core i5-3470 cpu 3.20ghz (ivy bridge), 1 cpu, 4 logical and 4 physical cores .net core sdk=3.0.100 [host] : .net core 2.2.6 (coreclr 4.6.27817.03, corefx 4.6.27818.02), 64bit ryujit job-cbytby : .net core 2.2.6 (coreclr 4.6.27817.03, corefx 4.6.27818.02), 64bit ryujit iterationcount=5 launchcount=1 warmupcount=1
method | rowscount | mean | error | stddev | min | max | median | ratio | ratiosd | gen 0 | gen 1 | gen 2 | allocated |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
npoixlsworkbookinit | 10000 | 324.7 ms | 1.583 ms | 0.4110 ms | 324.3 ms | 325.4 ms | 324.6 ms | 1.00 | 0.00 | 10000.0000 | 5000.0000 | 2000.0000 | 78.6 mb |
npoixlsxworkbookinit | 10000 | 1,369.0 ms | 73.747 ms | 19.1517 ms | 1,341.3 ms | 1,384.4 ms | 1,381.1 ms | 4.22 | 0.06 | 57000.0000 | 14000.0000 | 4000.0000 | 306.45 mb |
epplusworkbookinit | 10000 | 552.9 ms | 12.740 ms | 3.3085 ms | 549.7 ms | 557.7 ms | 552.4 ms | 1.70 | 0.01 | 18000.0000 | 7000.0000 | 3000.0000 | 121.05 mb |
npoixlsworkbookinit | 30000 | 1,222.4 ms | 33.717 ms | 8.7562 ms | 1,209.0 ms | 1,233.1 ms | 1,222.5 ms | 1.00 | 0.00 | 29000.0000 | 11000.0000 | 3000.0000 | 235.03 mb |
npoixlsxworkbookinit | 30000 | 4,226.2 ms | 299.833 ms | 77.8658 ms | 4,109.5 ms | 4,308.6 ms | 4,257.2 ms | 3.46 | 0.08 | 174000.0000 | 34000.0000 | 6000.0000 | 913.9 mb |
epplusworkbookinit | 30000 | 1,695.4 ms | 31.751 ms | 8.2457 ms | 1,686.3 ms | 1,706.5 ms | 1,694.2 ms | 1.39 | 0.02 | 48000.0000 | 17000.0000 | 5000.0000 | 358.51 mb |
npoixlsworkbookinit | 50000 | 2,323.5 ms | 236.041 ms | 61.2990 ms | 2,286.0 ms | 2,431.9 ms | 2,294.2 ms | 1.00 | 0.00 | 47000.0000 | 18000.0000 | 4000.0000 | 417.1 mb |
npoixlsxworkbookinit | 50000 | 7,055.2 ms | 279.256 ms | 72.5218 ms | 6,982.8 ms | 7,150.2 ms | 7,027.2 ms | 3.04 | 0.10 | 288000.0000 | 51000.0000 | 6000.0000 | 1545.32 mb |
epplusworkbookinit | 50000 | 2,806.9 ms | 56.266 ms | 14.6121 ms | 2,792.9 ms | 2,829.1 ms | 2,804.6 ms | 1.21 | 0.03 | 79000.0000 | 27000.0000 | 7000.0000 | 578.46 mb |
npoixlsworkbookinit | 65535 | 3,646.8 ms | 131.129 ms | 34.0537 ms | 3,603.0 ms | 3,696.3 ms | 3,642.5 ms | 1.00 | 0.00 | 61000.0000 | 21000.0000 | 4000.0000 | 504.46 mb |
npoixlsxworkbookinit | 65535 | 9,295.6 ms | 486.761 ms | 126.4104 ms | 9,163.3 ms | 9,468.6 ms | 9,330.5 ms | 2.55 | 0.04 | 390000.0000 | 67000.0000 | 8000.0000 | 2048.14 mb |
epplusworkbookinit | 65535 | 3,721.6 ms | 124.945 ms | 32.4478 ms | 3,680.7 ms | 3,766.8 ms | 3,714.1 ms | 1.02 | 0.01 | 102000.0000 | 35000.0000 | 8000.0000 | 747.85 mb |
从上面的测试结果来看,npoi 导出 xls 的性能还是相当好的,无论是所用时间还是内存都占优势,只是 xls 一个 sheet 最多 65535 行数据,所以测试数据最多只有 65535,其次就是 epplus 导出 xlsx,最次是 npoi 导出 xlsx 了。
测试结论
如果使用 npoi 导出建议导出 xls
,如果要导出数据较多,可以导出 csv ,如果看了另外一个 csv 导出的测试,csv 导出性能要比 excel 好很多,如果实在是要导出 excel,导入 xls
的话就分多个 sheet 处理,如果一定要导出 xlsx
格式的 excel ,推荐用 epplus 来处理,相比 npoi 导出 xlsx
性能更好,内存占用更少
reference
推荐阅读
-
NPOI导出EXCEL时用到的一些方法
-
NPOI 导出 excel 性能测试
-
【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)
-
C#使用NPOI将List数据导出到Excel文档
-
asp.net 利用NPOI导出Excel通用类的方法
-
fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
-
C#使用NPOI将List数据导出到Excel文档
-
.Net NPOI 根据excel模板导出excel
-
C# NPOI大数据量导出多个sheet的Excel
-
C#导出EXCEL超大数据源码,解决内存溢出问题,使用OLEDB方式(NPOI做不到)