NPOI 导出 excel 性能测试

NPOI 导出 excel 性能测试

Intro

网上看到很多人说 NPOI 的性能不行,自己写了一个 NPOI 的扩展库,于是想尝试看看 NPOI 的性能究竟怎么样,道听途说始终不如自己动手一试。

测试环境

测试工具:

  • BenchmarkDotNet v0.11.5

  • EPPlus.Core.Extensions v2.3.2

  • EPPlus v4.5.3.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();	
    }	
}

测试结果

在 Github 上查看结果 https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/BenchmarkDotNet.Artifacts/results/WeihanLi.Npoi.Benchmark.WorkbookBasicTest-report-github.md

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  
MethodRowsCountMeanErrorStdDevMinMaxMedianRatioRatioSDGen 0Gen 1Gen 2Allocated
NpoiXlsWorkbookInit10000324.7 ms1.583 ms0.4110 ms324.3 ms325.4 ms324.6 ms1.000.0010000.00005000.00002000.000078.6 MB
NpoiXlsxWorkbookInit100001,369.0 ms73.747 ms19.1517 ms1,341.3 ms1,384.4 ms1,381.1 ms4.220.0657000.000014000.00004000.0000306.45 MB
EpplusWorkbookInit10000552.9 ms12.740 ms3.3085 ms549.7 ms557.7 ms552.4 ms1.700.0118000.00007000.00003000.0000121.05 MB














NpoiXlsWorkbookInit300001,222.4 ms33.717 ms8.7562 ms1,209.0 ms1,233.1 ms1,222.5 ms1.000.0029000.000011000.00003000.0000235.03 MB
NpoiXlsxWorkbookInit300004,226.2 ms299.833 ms77.8658 ms4,109.5 ms4,308.6 ms4,257.2 ms3.460.08174000.000034000.00006000.0000913.9 MB
EpplusWorkbookInit300001,695.4 ms31.751 ms8.2457 ms1,686.3 ms1,706.5 ms1,694.2 ms1.390.0248000.000017000.00005000.0000358.51 MB














NpoiXlsWorkbookInit500002,323.5 ms236.041 ms61.2990 ms2,286.0 ms2,431.9 ms2,294.2 ms1.000.0047000.000018000.00004000.0000417.1 MB
NpoiXlsxWorkbookInit500007,055.2 ms279.256 ms72.5218 ms6,982.8 ms7,150.2 ms7,027.2 ms3.040.10288000.000051000.00006000.00001545.32 MB
EpplusWorkbookInit500002,806.9 ms56.266 ms14.6121 ms2,792.9 ms2,829.1 ms2,804.6 ms1.210.0379000.000027000.00007000.0000578.46 MB














NpoiXlsWorkbookInit655353,646.8 ms131.129 ms34.0537 ms3,603.0 ms3,696.3 ms3,642.5 ms1.000.0061000.000021000.00004000.0000504.46 MB
NpoiXlsxWorkbookInit655359,295.6 ms486.761 ms126.4104 ms9,163.3 ms9,468.6 ms9,330.5 ms2.550.04390000.000067000.00008000.00002048.14 MB
EpplusWorkbookInit655353,721.6 ms124.945 ms32.4478 ms3,680.7 ms3,766.8 ms3,714.1 ms1.020.01102000.000035000.00008000.0000747.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

  • https://benchmarkdotnet.org/

  • https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/perf/WeihanLi.Npoi.Benchmark/WorkbookBasicTest.cs

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值