C# 调试时,Epplus Save()、SaveAs()等方法的操作非常缓慢

C# 调试时,Epplus Save()、SaveAs()等方法的操作非常缓慢,c#,.net-core,epplus,C#,.net Core,Epplus,环境-Windows 10、Visual Studio 2017、netcore2.0、调试版本 Saving 100 rows in 585ms. Saving 200 rows in 114ms. Saving 400 rows in 125ms. Saving 800 rows in 159ms. Saving 1600 rows in 233ms. Saving 3200 rows in 360ms. Saving 6400 rows in 655ms. Saving 12800 row

环境-Windows 10、Visual Studio 2017、netcore2.0、调试版本

Saving 100 rows in 585ms.
Saving 200 rows in 114ms.
Saving 400 rows in 125ms.
Saving 800 rows in 159ms.
Saving 1600 rows in 233ms.
Saving 3200 rows in 360ms.
Saving 6400 rows in 655ms.
Saving 12800 rows in 1251ms.
Saving 25600 rows in 2422ms.
Saving 51200 rows in 4840ms.
Saving 102400 rows in 9789ms.
Saving 204800 rows in 19094ms.
Saving 409600 rows in 38093ms.
在调试过程中使用Epplus 4.1.1保存Excel文件时,保存操作花费的时间比我预期的要长得多

下面是使用Debug->Start Debug运行时的一些计时

Saving 100 rows in 2065ms.
Saving 200 rows in 2050ms.
Saving 400 rows in 4003ms.
Saving 800 rows in 11360ms.
Saving 1600 rows in 18377ms.
Saving 3200 rows in 34139ms.
Saving 100 rows in 401ms.
Saving 200 rows in 49ms.
Saving 400 rows in 28ms.
Saving 800 rows in 58ms.
Saving 1600 rows in 94ms.
Saving 3200 rows in 198ms.
使用调试->不调试启动运行时也是如此

Saving 100 rows in 2065ms.
Saving 200 rows in 2050ms.
Saving 400 rows in 4003ms.
Saving 800 rows in 11360ms.
Saving 1600 rows in 18377ms.
Saving 3200 rows in 34139ms.
Saving 100 rows in 401ms.
Saving 200 rows in 49ms.
Saving 400 rows in 28ms.
Saving 800 rows in 58ms.
Saving 1600 rows in 94ms.
Saving 3200 rows in 198ms.
以.NET Framework 4.6.1为目标时,调试时的结果要好得多-

Saving 100 rows in 215ms.
Saving 200 rows in 26ms.
Saving 400 rows in 42ms.
Saving 800 rows in 78ms.
Saving 1600 rows in 146ms.
Saving 3200 rows in 279ms.
我显然知道调试速度很慢,但数据量很小。在调试.NETCore2.0时,我能做些什么来加快速度

--

以下是产生上述输出的程序-

namespace ConsoleApp9
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Linq;
    using System.Diagnostics;

    using OfficeOpenXml;

    public class Foo
    {
        public string Name { get; set; }
        public int Number { get; set; }
        public char? Character { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            IEnumerable<Foo> RandomFoo()
            {
                var random = new Random();
                const string chars = "ABCDEFGHIJKLH";
                while (true)
                {
                    yield return new Foo
                    {
                        Character = random.NextDouble() < .1 ? null : (char?) 'A',
                        Number = random.Next(0, 10),
                        Name = new string(Enumerable.Repeat(chars, 8)
                            .Select(x => x[random.Next(x.Length)])
                            .ToArray()
                        )
                    };
                }
            }

            for (var i = 100; i <= 1000000; i *= 2)
            {
                var sw = Stopwatch.StartNew();

                var stream = new MemoryStream();
                using (var package = new ExcelPackage(stream))
                {
                    var sheet = package.Workbook.Worksheets.Add("Sheet");
                    var foos = RandomFoo().Take(i);
                    sheet.Cells["A1"].LoadFromCollection(foos);

                    package.Save(); // very long operation here
                    stream.Seek(0, SeekOrigin.Begin);
                }

                var file = new FileInfo("test.xlsx");
                using (var fileStream = file.Create())
                {
                    stream.CopyTo(fileStream);
                }

                Console.WriteLine($"Saving {i} rows in {sw.ElapsedMilliseconds}ms.");
            }
        }
    }
}
名称空间控制台App9
{
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用系统文本;
使用System.Linq;
使用系统诊断;
使用OfficeOpenXml;
公开课Foo
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共字符?字符{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
RegisterProvider(CodePagesEncodingProvider.Instance);
IEnumerable RandomFoo()
{
var random=新的random();
常量字符串chars=“ABCDEFGHIJKLH”;
while(true)
{
收益率回报新Foo
{
Character=random.NextDouble()<.1?空:(char?)A,
数字=随机。下一个(0,10),
名称=新字符串(可枚举。重复(字符,8)
.选择(x=>x[random.Next(x.Length)])
.ToArray()
)
};
}
}

对于(var i=100;iEPPLUS v4.4.1不完全兼容.net core 2,但我得到的数字与您的(逻辑数字)不同

我建议您使用与.net core 2兼容的预发行版 环境

以下是我在Windows 10、Visual Studio 2017、netcore2.0、调试版本中使用EPPLUS v4.5.0.1-beta获得的数字

Saving 100 rows in 585ms.
Saving 200 rows in 114ms.
Saving 400 rows in 125ms.
Saving 800 rows in 159ms.
Saving 1600 rows in 233ms.
Saving 3200 rows in 360ms.
Saving 6400 rows in 655ms.
Saving 12800 rows in 1251ms.
Saving 25600 rows in 2422ms.
Saving 51200 rows in 4840ms.
Saving 102400 rows in 9789ms.
Saving 204800 rows in 19094ms.
Saving 409600 rows in 38093ms.

我也有同样的问题,因为我将字符值存储在单元格中: 工作表。单元格[i,j]。值='A'; 它正在工作,但在保存时会产生转换强制转换异常,这会大大降低VS调试器的速度。 只要存储一个字符串!
worksheet.Cells[i,j].Value=“A”

我在调试和未调试的情况下得到相同数量级的结果(3200行为357ms与257ms)。是否设置了任何条件断点?您有什么版本的EPPlus?没有条件断点。我使用EPPlus版本(4.1.1)进行了更新。