ProKiLL
@ProKiLL
Системный администратор

Как ускорить выполнение операций?

Добрый день!
Есть функция:
public List<Letter> AllRegLetter(Users user, string interval)
        {
            List<Letter> ll = new List<Letter>();
            try
            {                
                List<Access_rights> temp = AllAccessRightsList(user);
                List<Access_rights> userSearch = temp.FindAll(delegate(Access_rights teach) { return teach.id.ToString().StartsWith("7"); });
                if (userSearch.Count != 0)
                    if (userSearch[0].id == 7)
                    {
                        DataTable dt = Get("SELECT registry.id, registry.reg_num, registry.reg_date, registry.Theme, registry.List_doc, registry.List_add, registry.Contractor, registry.type_send, registry.Send_date FROM registry INNER JOIN recipients ON recipients.letterId = registry.id WHERE registry.reg_date >= '" + interval + "-01' GROUP BY registry.id ORDER BY registry.reg_num ASC");
                        if (dt.Rows.Count > 0)
                        {
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                Letter le = new Letter();
                                le.id = dt.Rows[i].Field<int>("id");
                                le.reg_num = dt.Rows[i].Field<int>("reg_num");
                                le.reg_date = dt.Rows[i].Field<object>("reg_date").ToString();
                                le.Theme = dt.Rows[i].Field<string>("Theme");
                                le.List_doc = dt.Rows[i].Field<int>("List_doc");
                                le.List_add = dt.Rows[i].Field<int>("List_add");
                                #region Обрабатываем исполнителя
                                List<Users> Contractor = new List<Users>();
                                DataTable dtc = Get("SELECT `сontractors`.id_Letter, `сontractors`.id_user FROM `сontractors` WHERE `сontractors`.id_Letter = " + dt.Rows[i].Field<int>("id") + ";");
                                if (dtc.Rows.Count > 0)
                                    for (int k = 0; k < dtc.Rows.Count; k++)
                                    {
                                        Users contr = new Users();
                                        contr.id = dtc.Rows[k].Field<int>("id_user");
                                        Contractor.Add(WhoLogin(user, contr));
                                    }
                                le.Contractor = Contractor;
                                #endregion
                                TypeSend ts = new TypeSend();
                                ts.id = dt.Rows[i].Field<int>("type_send");
                                le.type_send = WhoTypeSend(user, ts);
                                le.Send_date = dt.Rows[i].Field<object>("Send_date").ToString();
                                #region Заполняем данные об адресатах
                                List<Recipients> lrec = new List<Recipients>();
                                DataTable dtr = Get("SELECT recipients.id, recipients.where_and_who, recipients.outgoing_num, recipients.outgoing_date FROM recipients WHERE recipients.letterId = " + dt.Rows[i].Field<int>("id") + ";");
                                if (dtr.Rows.Count > 0)
                                    for (int k = 0; k < dtr.Rows.Count; k++)
                                    {
                                        Recipients recip = new Recipients();
                                        recip.id = dtr.Rows[k].Field<int>("id");
                                        recip.adress = dtr.Rows[k].Field<string>("where_and_who");
                                        recip.outgoing_num = dtr.Rows[k].Field<string>("outgoing_num");
                                        recip.outgoing_date = dtr.Rows[k].Field<object>("outgoing_date").ToString();

                                        lrec.Add(recip);
                                    }
                                le.rec = lrec;
                                #endregion
                                ll.Add(le);
                            }
                        }
                    }
                    else
                    {
                    }
            }
            catch (Exception ex)
            {
                Logger.WriteLine(ex.ToString());
            }

            return ll;
        }

Выполнение данной функции с заполнением базы вырастает на ~0,2 сек на 1 запись
Как ускорить заполнение класса, что бы свести время отработки функции к минимуму?
Думал разбить цикл for (int i = 0; i < dt.Rows.Count; i++) по потокам, но как то в голову мысли не придут как это сделать.
Просьба подсказать.
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 3
Тот самый цикл, на который вы указываете, замените на конструкцию Parallel.For
Он сам знает сколько потоков создать и как ими управлять.
Ответ написан
DarkRaven
@DarkRaven
разработка программного обеспечения
Я бы вам посоветовал посмотреть на Dapper.
Ну или не заполнять таблицу в Get а возвращать IDbReader и его разматывать в цикле, заполняя структуру данными.
Простой маппер на коленке можно написать за пару минут, там нет ничего сложного. Таким образом, вы уберете достаточно дорогую операцию преобразования данных в таблицу, обеспечите минимум операций посредников между Get и return li.
Ответ написан
Комментировать
Разбить метод на несколько простых.
Не строить запросы через "" + "", вызывать хранимки с параметрами.

method_1( args )
{
    var items = method_2( args ); // get items
    method_3( items ); // process items

    var items2 = method_4( args ) ...
}

method_2( args... )
{
   ...
}


Так проще будет понять что сколько выполняется, просто установив точки останова, и студия сама на строчках будет писать сколько времени прошло с последней точки останова.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы