【发布时间】:2019-01-02 12:17:57
【问题描述】:
我有一个 .NET Core 类库(我们称之为 Core),我想使用 WPF GUI 来使用它的一些功能。但与 .NET Core 相比,.NET 似乎非常慢。例如,我想运行以下方法:
private static void LoadData()
{
Stopwatch w = new Stopwatch();
List<BookingRecord> records = new List<BookingRecord>();
w.Start();
string csv = File.ReadAllText("/BookingData/Booking_Data - Copy.csv");
Console.WriteLine(w.Elapsed);
w.Restart();
var lines = csv.Split('\n');
foreach(var line in lines.Skip(1))
{
var data = line.Split(';');
records.Add(new BookingRecord()
{
Origin = data[2],
Destination = data[3],
FlightDate = DateTime.Parse(data[4], new CultureInfo("De-de").DateTimeFormat),
PassengersNumber = int.Parse(data[9])
});
}
Console.WriteLine(w.Elapsed);
w.Stop();
}
为此,我使用了两个控制台应用程序,一个在 .NET Core 下,一个在 .NET Framework 下。在.NET Core 下构建BookingData 列表的时间是0.4s,而在.NET Framework 的情况下大约是10s,这是有问题的,因为我将加载大约200 万行及以上的较大文件(客户端要求)。
那么有什么办法可以解决这个问题吗?目标是提供一个显示核心库结果的 GUI。
编辑
上面的sn -p只是为了提供MCVE,否则我在CsvHelper的帮助下使用StreamReader读取文件,边读边构建。
编辑 2
数据的加载和构建是在Core库内部构建的,也就是说使用.NET Core、WPF或.NET Framework项目一般,只是引用Core库并使用它的方法,它只是一个显示工具.为什么它必须产生与将代码移动到 .NET 项目时相同的结果?
【问题讨论】:
-
是的,.Net 比 .Net Core 慢,但是您读取文件的方式一开始就不是很高效。作为第一步,您应该尝试使用 StreamReader 并逐行读取文件,而不是将整个文件读入内存。
-
@Compufreak,谢谢,是的,我正在使用 StreamReader 并逐行阅读和构建,问题中包含的代码只是为了提供 MCVE。
-
上面的代码不是 MCVE。它不完整,因此无法验证。我创建了一个测试应用程序,它使用此处的“10,000”文件:sample-videos.com/download-sample-csv.php 和此代码:pastebin.com/T3cipQZJ,当在核心/框架上运行时,时间非常相似:00:00:00.0285065 到 00:00:00.0621625核心,00:00:00.0350395 到 00:00:00.0421969 用于框架。原始结果:pastebin.com/q9eHm7Vj
-
@AndyJ,我认为它已经完成,我只运行提供的方法,而且我无法产生与您的解决方案相同的结果。话虽如此,正如我在 EDIT 2 中所问的那样。当我在 .NET Framework 中从 .NET Core 引用 dll 时,它不应该使用 .NET Core 性能吗?
-
MCVE 在此处定义:stackoverflow.com/help/mcve“完成 - 提供重现问题所需的所有部分”。使用您提供的代码无法重现该问题。它没有
BookingRecord,也没有你正在加载的数据文件。
标签: c# .net performance .net-core