Долгое преобразование данных из MySql

196
16 июля 2018, 21:30

Начал изучать C#. Проблема вот в чем. Подключаюсь базе используя стандартный коннектор, получаю данные. Но вот преобразование этих данных происходит очень медленно. Количество строк 50000 - 150000, по времени преобразование занимает 30-60 сек. Хотя сам запрос и получение данных из БД происходит менее чем за 1 сек.

Возможно ли как-то ускорить этот процесс???

Причем на отладчике видно что в это время происходит очень частая сборка мусора подозреваю что в этом причина. Класс Price имеет три свойства. Код следующий:

List<Price> Prices = new List<Price>();

                Db_Connection.Open();
                MySqlDataReader myReader = commandDatabase.ExecuteReader();
                if (myReader.HasRows)
                {
                    int i = 0;
                    while (myReader.Read())
                    {
                        Prices.Add(new Price());
                        Prices[i].Timestamp = Convert.ToInt32(ConvertToUnixTimestamp(myReader.GetString(1)));
                        Prices[i].Bid = Convert.ToDouble(myReader.GetString(2));
                        Prices[i].Ask = Convert.ToDouble(myReader.GetString(3));
                        i++;
                    }
                }
                Db_Connection.Close();
Answer 1

Докопался до причины. Оказалось все просто. Виновата функция

static double ConvertToUnixTimestamp(string date_str)
    {
        DateTime date = DateTime.Parse(date_str, new CultureInfo("ru-RU"));
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0);
        TimeSpan diff = date - origin;
        return Math.Floor(diff.TotalSeconds);
    }

Т.к. при конвертировании каждый раз создаются 2 объекта new CultureInfo("ru-RU") и new DateTime(1970, 1, 1, 0, 0, 0) это порождает большое количество мусора. В таком виде работает быстрее.

static CultureInfo Culture = new CultureInfo("ru-RU");
    static DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0);
    public static double ConvertToUnixTimestamp(string date_str)
    {
        DateTime date = DateTime.Parse(date_str, Culture);
        TimeSpan diff = date - origin;
        return Math.Floor(diff.TotalSeconds);
    }

Теперь на преобразование 60000 записей тратится 0,25 сек. вместо 30-40 сек. Всем спасибо за участие.

READ ALSO
C# обобщения vs object

C# обобщения vs object

Какая разница между этими двумя класами? Что в первом универсальный тип данных - что во второмБолее того, насколько я знаю, компилятор тип...

291
InitialDirectory для FileDialog

InitialDirectory для FileDialog

Всем привет :) Как можно добавить InitialDirectory для FileDialog в файл конфигурации XML?

212
Как отловить null в ComboBox.SelectedItem?

Как отловить null в ComboBox.SelectedItem?

Есть кусок кода, который формирует путь по шаблону с добавлением выбранных пунктовWorkerList - это и есть ComboBox

184
C# Разгадываниe текста по картинке

C# Разгадываниe текста по картинке

У меня есть картинка с текстом написанным необычным шрифтом

147