CsvHelper работает очень медленно в VisualStudio 2013

Я работал над проектом с 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;
    }

person ajmena    schedule 07.06.2018    source источник
comment
То же самое в режиме отладки и в выпуске? Версия фреймворка такая же? Если это не отладчик замедляет работу, то я сомневаюсь, что сама Visual Studio будет иметь какое-либо отношение к этой проблеме.   -  person Llama    schedule 07.06.2018
comment
Тот же проект с теми же свойствами в том же режиме.   -  person ajmena    schedule 07.06.2018
comment
Ну какой-нибудь минимально воспроизводимый пример? Любая скамья, которая сужает проблему до блока кода? Потому что пока информации недостаточно даже для описания проблемы   -  person Drag and Drop    schedule 07.06.2018
comment
Хорошо, но это в отладке или выпуске? Дело в том, что отладчик в двух версиях может быть разным, так что можете сравнить скорость в релизном режиме?   -  person Llama    schedule 07.06.2018
comment
@ajmena как ты можешь быть уверен? Существуют различия в производительности компилятора, отладчика, Framework, NuGet и между старой версией, такой как 2013, и старой, но еще не поддерживаемой VS 2015. Почему вы вообще понизили версию? Почему вы не используете текущую версию?   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
Я тестировал в режиме отладки. Теперь я тоже тестировал в выпуске и тот же результат. 1-2 секунды в VS2015 против 5-6 минут в VS2013.   -  person ajmena    schedule 07.06.2018
comment
@ajmena, кроме того, вместо того, чтобы предполагать, что виновата IDE, профилируйте свое приложение. Тот же результат с совершенно разными IDE, пакетами и т. д. ничего не значит.   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
Кроме того, в коде есть несколько ошибок, которые повлияют на производительность старых сборщиков мусора. Вы создаете новый массив пустых строк и выбрасываете его в каждой строке. Это 1 объект-сирота, который нужно собирать в каждой строке. Вы читаете значения ячеек как строки вместо, например, десятичных знаков в цикле и затем анализируете их. Это больше отходов - CsvHelper может обрабатывать чтение и анализ без временных строк. Плохой разбор и кастинг тоже (decimal)float.Parse почему?   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
Наконец, вы не можете оценивать код по времени одного или даже нескольких его исполнений. Скорее всего, вы измеряете производительность сборщика мусора старой версии фреймворка. Используйте такую ​​программу, как BenchmarkDotNet, которая измеряет реальное время выполнения, выделения ресурсов, время сборки мусора и т. д. и выполняет достаточное количество измерений, чтобы обеспечить точность результатов.   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
Проект в VS2015 представляет собой библиотеку классов для внешнего приложения разных заказчиков. Одно из таких приложений находится в VS2013. Я не думал, что это будет конфликт. Проблема со скоростью возникает при тестировании dll.   -  person ajmena    schedule 07.06.2018
comment
Я использую (десятичный) float.Parse, потому что, если я использую только decimal.Parse со значениями, такими как 2.979207395260004e-15, происходит сбой. Мне нужно десятичное число; в противном случае дальнейшее плавание теряет точность в некоторых операциях, которые я делаю. Если это другой способ, я хотел бы знать.   -  person ajmena    schedule 07.06.2018
comment
Так что выполните бинарный поиск и сузьте, какая часть вашего кода занимает так много времени, закомментировав некоторые строки.   -  person MineR    schedule 07.06.2018
comment
@ajmena decimal.Parse("2.979207395260004e-15",System.Globalization.NumberStyles.Float) как показано здесь. Приложения BTW НЕ находятся в VS 2013. Они нацелены на определенные платформы. Вы можете использовать один и тот же проект с несколькими IDE, хотя это не отвечает на вопрос Why VS 2013?.   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
@ajmena The speed problem arise testing the dll., значит, вы измеряли производительность тестового запуска вместо фактического кода? Какую среду тестирования, средство запуска и версии вы использовали? Как вы измеряли производительность? Вы до сих пор не объяснили, что сделали, кроме того, что сказали, что это то же самое, что явно не так.   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
@ajmena, конечно, очевидное решение — открыть последний проект в Visual Studio 2015 или, что еще лучше, в 2017 и покончить с этим. DLL будут работать одинаково во всех IDE. Не версия IDE определяет совместимость сборки   -  person Panagiotis Kanavos    schedule 07.06.2018
comment
Вы были правы насчет сборщиков мусора. Я удалил строку массива и знаю, что работает с одинаковой скоростью в VS2013 и VS2015. Большое спасибо.   -  person ajmena    schedule 07.06.2018
comment
BTW decimal.Parse(2.979207395260004e-15,System.Globalization.NumberStyles.Float) не работает. Входная строка имеет неправильный формат.   -  person ajmena    schedule 07.06.2018
comment
System.Globalization.NumberStyles.Float работает, извините. В моем случае мне нужно добавить культуру.   -  person ajmena    schedule 07.06.2018


Ответы (1)


Проблема была в коде. Панайотис Канавос отметил:

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;
    }

Спасибо Панайотису Канавосу за большую помощь.

person ajmena    schedule 07.06.2018
comment
Вы можете поручить CsvHelper сделать все за вас. gist.github.com/JoshClose/03568bd5faabcab4d2d4d1111b69d0ca - person Josh Close; 07.06.2018
comment
Хороший подход. Но я проверил это немного медленнее, чем мое решение. Итак, пока я буду придерживаться своего решения. - person ajmena; 11.06.2018