CsvHelper очень медленно в VisualStudio 2013 - PullRequest
0 голосов
/ 07 июня 2018

Я работал над проектом с CsvHelper в Visual Studio 2015. Он работал нормально.Затем я переключился на Visual Studio 2013, чтобы провести некоторый тест, и CsvHelper работал очень медленно.Когда в VS 2015 требуется максимум 2 секунды, чтобы прочитать большой файл, в VS2013 требуется более 5 минут.

Я тестирую тот же проект, открытый в VS2013 и VS2015.В VS2013 работает медленно, в VS2015 наоборот.Тот же проект.

Итак, VS2013 должен что-то делать, чтобы вызвать медленную скорость CsvHelper.Есть идеи?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я запускаю каждый тест в режиме отладки.

Я добавляю свою фактическую функцию чтения:

    internal void ReadInCSVPoint3DNew(string absolutePath)
    {
        CultureInfo Culture = new CultureInfo("en-US");
        List<Point3D> result = new List<Point3D>();
        string value;
        using (TextReader fileReader = File.OpenText(absolutePath))
        {
            var csv = new CsvReader(fileReader);
            csv.Configuration.HasHeaderRecord = false; // The head is not in good format, so, setting it true doesn't work.
            csv.Read(); // Skip Head
            while (csv.Read())
            {
                string[] Strings = new String[13];
                for (int i = 0; csv.TryGetField<string>(i, out value); i++)
                {
                    Strings[i] = value;
                }

                Point3D point = new Point3D()
                {
                    PointX = (decimal)float.Parse(Strings[0], Culture),
                    PointY = (decimal)float.Parse(Strings[1], Culture),
                    PointZ = (decimal)float.Parse(Strings[2], Culture),
                    X = (decimal)float.Parse(Strings[3], Culture),
                    Y = (decimal)float.Parse(Strings[4], Culture),
                    Z = (decimal)float.Parse(Strings[5], Culture),
                    Intensity = (int)float.Parse(Strings[6], Culture),
                    LaserIndex = (int)float.Parse(Strings[7], Culture),
                    Azimuth = (int)float.Parse(Strings[8], Culture),
                    Distance = (decimal)float.Parse(Strings[9], Culture),
                    AdjustTime = (long)float.Parse(Strings[10], Culture),
                    TimeStamp = (long)float.Parse(Strings[11], Culture),
                    VerticalAngle = (int)float.Parse(Strings[12], Culture)
                };
                result.Add(point);
            }
        }
        this.Data = result;
    }

1 Ответ

0 голосов
/ 07 июня 2018

Проблема была в коде.Panagiotis Kanavos отметил:

Blockquote Кроме того, в коде есть несколько ошибок, которые влияют на производительность в старых сборщиках мусора.Вы создаете новый пустой массив строк и выбрасываете его в каждой строке.Это 1 бесхозный объект, который нужно собрать в каждой строке.

Я удалил строковый массив из кода и теперь работает с той же скоростью в VS2013 и VS2015.Я тоже поменял разборы.Код теперь выглядит следующим образом:

    internal void ReadInCSVPoint3DNew(string absolutePath)
    {
        CultureInfo Culture = new CultureInfo("en-US");
        List<Point3D> result = new List<Point3D>();
        using (TextReader fileReader = File.OpenText(absolutePath))
        {
            var csv = new CsvReader(fileReader);
            csv.Configuration.HasHeaderRecord = false; // The head is not in good format, so, setting it true doesn't work.
            csv.Read(); // Skip Head
            while (csv.Read())
            {
                Point3D point = new Point3D()
                {
                    PointX = decimal.Parse(csv.GetField(0), System.Globalization.NumberStyles.Float, Culture),
                    PointY = decimal.Parse(csv.GetField(1), System.Globalization.NumberStyles.Float, Culture),
                    PointZ = decimal.Parse(csv.GetField(2), System.Globalization.NumberStyles.Float, Culture),
                    X = decimal.Parse(csv.GetField(3), System.Globalization.NumberStyles.Float, Culture),
                    Y = decimal.Parse(csv.GetField(4), System.Globalization.NumberStyles.Float, Culture),
                    Z = decimal.Parse(csv.GetField(5), System.Globalization.NumberStyles.Float, Culture),
                    Intensity = int.Parse(csv.GetField(6), System.Globalization.NumberStyles.Float, Culture),
                    LaserIndex = int.Parse(csv.GetField(7), System.Globalization.NumberStyles.Float, Culture),
                    Azimuth = int.Parse(csv.GetField(8), System.Globalization.NumberStyles.Float, Culture),
                    Distance = decimal.Parse(csv.GetField(9), System.Globalization.NumberStyles.Float, Culture),
                    AdjustTime = long.Parse(csv.GetField(10), System.Globalization.NumberStyles.Float, Culture),
                    TimeStamp = long.Parse(csv.GetField(11), System.Globalization.NumberStyles.Float, Culture),
                    VerticalAngle = int.Parse(csv.GetField(12), System.Globalization.NumberStyles.Float, Culture)
                };
                result.Add(point);
            }
        }
        this.Data = result;
    }

Спасибо Panagiotis Kanavos за большую помощь.

...