.Net Core и .NET Framework проблема с производительностью - PullRequest
0 голосов
/ 02 января 2019

У меня есть библиотека классов .NET Core (назовем ее Core), и я хочу использовать WPF GUI для использования некоторых ее функций.Но, похоже, .NET очень медленный по сравнению с .NET Core.Например, у меня есть следующий метод, который я хотел бы запустить:

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.время создания списка BookingData в .NET Core составляет 0.4s, в то время как в случае .NET Framework - около 10s, что проблематично, так как я буду загружать большие файлы размером примерно 2 миллиона строк и более (клиенттребование).

Так есть ли решение этой проблемы?Цель состоит в том, чтобы предоставить графический интерфейс, отображающий результаты из библиотеки Core.

РЕДАКТИРОВАТЬ

Фрагмент, приведенный выше, предназначен только для предоставления MCVE, в противном случае яЯ читаю файл, используя StreamReader с помощью CsvHelper, и построение выполняется во время чтения.

РЕДАКТИРОВАТЬ 2

Загрузка и построение данных встроены в библиотеку Core, другими словами, используя .NET Core, проект WPF или .NET Framework в целом, просто ссылается на библиотеку Core и, используя ее методы, это всего лишь инструмент отображения.Почему он должен давать тот же результат, что и при перемещении кода в проект .NET?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Попробуйте переместить создание списка после прочтения строк:

var lines = csv.Split('\n');
var records = new List<BookingRecord>(lines.Length);

Это должно создать огромную разницу. В вашей версии он начнется с базового массива из 8 элементов, когда он заполнится, создайте новый из 16 элементов и скопируйте старые, когда он заполнится, создайте базовый массив из 32 элементов и скопируйте 16 элементов и т. Д. .

Инициализация до нужного размера предотвращает это. Может быть, Core уже может сделать это умнее. Предполагается, что он будет значительно быстрее, хотя коэффициент 25х, кажется, указывает на то, что здесь есть что-то еще.

Еще быстрее будет, если вы сделаете запись структурой, а не классом, поскольку она может зарезервировать весь кусок памяти за один раз вместо маленьких битов на запись.

0 голосов
/ 02 января 2019

Одной из основных причин, по которой MS говорит, что вам следует использовать .Net Core, является повышение производительности.Похоже, поиск в Google подтверждает это.

Однако, независимо от того, какую платформу вы используете, вы, скорее всего, увидите более высокую производительность и определенно лучшее использование памяти, если вы будете читать файл по одной строке за раз, используя какое-тобуферизованный читатель.Использование ReadAllText попытается загрузить все 2 миллиона строк в память одновременно.В этом нет необходимости, если все, что вы делаете - это обрабатываете каждую строку в порядке их появления в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...