Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 22
1

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?

18.05.2016, 01:06. Просмотров 579. Ответов 3
Метки нет (Все метки)


Всем привет! Господа, выручайте. Не пойму как еще оптимизировать...

Есть куча связанных таблиц. Нужно выводить статистику используя всю цепочку. Строками являются массив дат, которые задаются перед выводом статистики (по умолчанию выводятся данные за сег. день). Данных которые нужно считать не так уж много. Но то ли из-за неверной структуры базы, то ли из-за того что огромные массивы получаются, большие таблицы обрабатываются, то ли из-за кривой обработки данных... при диапазоне больше недели затупание происходит жуткое... Как можно это все оптимизировать? - что я не правильно делаю и куда нужны рыть, что будет правильно почитать?

Спасибо заранее всем, кто откликнется!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
private void UpdateVigr()
    {
        DateTime dtFrom = Tools.ParseDateTimeValue(tbDateFrom.Text);
        DateTime dtTo = Tools.ParseDateTimeValue(tbDateTo.Text);
 
        DateTime ddonopl = Tools.ParseDateTimeValue("11.05.2016");
 
        int d = (dtTo - dtFrom).Days;
 
        var result = new List<DateTime>();
 
        for (int i = 0; i <= d; i++)
            {
                result.Add(dtFrom.AddDays(i));
            }
 
 
 
            string tvig = "<table width='100%' Class='vigruz'><tr><th></th><th colspan='4'>бесплатные объявл.</th><th colspan='4'>платные объявл.</th><th rowspan='2' style='width: 150px; vertical-align: middle;'>рассылки</th></tr>" +
            "<th></th><th>объявл.</th><th>фирм</th><th>агентов</th><th>прибыль</th><th>объявл.</th><th>фирм</th><th>агентов</th><th>прибыль</th></tr>";
 
 
        int zkob1 = 0;
        int firmob1 = 0;
        int usob1 = 0;
        int prob1 = 0;
        int zkob2 = 0;
        int firmob2 = 0;
        int usob2 = 0;
        int prob2 = 0;
        var firmallfree = new List<Firm>();
        var userallfree = new List<UserAccount>();
        var firmallpl = new List<Firm>();
        var userallpl = new List<UserAccount>();
        int rassil = 0;
        int countday = 0;
        for (int i = 0; i <= (d + 2); i++)
        {
            tvig += "<tr><th>" + ((i == (d + 2)) ? ("итого (" + countday + ")") : ((i == (d + 1)) ? "среднее" : result[i].ToString("ddd. dd.MM.yy"))) + "</th>";
            countday += (i <= d) ? 1 : 0;
 
            for (int j = 0; j < 2; j++)
            {
                if (i <= d)
                {
                    var firm = new List<Firm>();
                    var user = new List<UserAccount>();
                    int zk = 0;
                    var firmnew = new List<Firm>();
                    var firmyes = new List<Firm>();
                    var demandsfree = new List<Demand>();
                    var demandsplat = new List<Demand>();
                    foreach (var demh in dl.Demands.Where(x=> (x.DateAdded.Date >= result[i].Date || x.DateLastChanges.Date >= result[i].Date) && x.DemandBoardHistoris.FirstOrDefault() != null).Where(x => x.DemandBoardHistoris.Where(y => y.Status != 1).Where(y => ((j == 0) ? y.ListBoards.Free : !y.ListBoards.Free)).Any(y => y.DateUp.Date == result[i].Date)))
                    {
                        if (!firm.Any(x => x == demh.Firm))
                        {
                            if (firmallfree.Distinct().Where(y => y == demh.Firm).Count() > 0)
                                firmyes.Add(demh.Firm);
                            else
                                firmnew.Add(demh.Firm);
 
                            firm.Add(demh.Firm);
                            if (j == 0)
                            {
                                firmallfree.Add(demh.Firm);
                            }
                        }
 
                        if (!user.Any(x => x == demh.UserAccount))
                        {
                            user.Add(demh.UserAccount);
                            if (j == 0)
                            {
                                userallfree.Add(demh.UserAccount);
                                firmallfree.Add(demh.Firm);
                            }
                            else
                            {
                                userallpl.Add(demh.UserAccount);
                            }
                        }
                        zk += 1;
                        if (j == 0)
                        {
                            demandsfree.Add(demh);
                        }
                        else
                        {
                            demandsplat.Add(demh);
                        }
                    }
 
                    int usc = user.Distinct().Count();
                    int firmc = firm.Distinct().Count();
                    int prib = 0;
                    int firmno = 0;
 
                    if (j == 1)
                    {
                        firmyes.Clear();
                        firmnew.Clear();
                        zk = 0;
                        firm.Clear();
                        var firmdebity = new List<Firm>();
                        var firmdebitn = new List<Firm>();
 
                        foreach (var fd in dl.FirmDebits.Where(x => x.DateAdded.Date == result[i].Date && x.RateNow == 9 && x.DateAdded.Date >= ddonopl.Date))
                        {
 
                            if (!firm.Any(x => x == fd.Firm))
                            {
                                if (firmallpl.Distinct().Where(y => y == fd.Firm).Count() > 0)
                                    firmyes.Add(fd.Firm);
                                else
                                    firmnew.Add(fd.Firm);
 
                                firm.Add(fd.Firm);
                                firmallpl.Add(fd.Firm);
                            }
                            zk += 1;
                            prib += 9;
                            firmdebity.Add(fd.Firm);
                        }
                        foreach (var fd in dl.FirmDebits.Where(x => x.DateAdded.Date == result[i].Date && x.SumBack == 9 && x.DateAdded.Date >= ddonopl.Date))
                        {
                            firmdebitn.Add(fd.Firm);
                            zk -= 1;
                            prib -= 9;
                        }
                        foreach (var fd in firmdebity.Distinct())
                        {
                            if (firmdebity.Where(x => x == fd).Count() == firmdebitn.Where(x => x == fd).Count())
                            {
                                firm.Remove(fd);
                                firmallpl.Remove(fd);
                                firmyes.Remove(fd);
                                firmnew.Remove(fd);
                            }
                        }
                        firmc = (firm == null) ? 0 : firm.Distinct().Count();
 
 
                        if (chekstatfirm.Checked == true)
                            foreach (Firm firms in firm.Where(x => x.FirmDebits.Any(y => y.DateAdded.Date >= result[i].AddDays(1).Date && y.DateAdded.Date <= dtTo.Date && y.DateAdded.Date >= ddonopl.Date)))
                            {
                                firmno += 1;
                            }
 
                    }
                    else
                    {
                        if(chekstatfirm.Checked == true)
                            foreach (Firm firms in firm.Where(x => x.Demands.Where(y => y.DateLastChanges.Date >= result[i].AddDays(1).Date || y.DateAdded.Date >= result[i].AddDays(1).Date).Where(y => y.DemandBoardHistoris.FirstOrDefault() != null).Any(y => y.DemandBoardHistoris.Any(g => g.DateUp.Date >= result[i].AddDays(1).Date && g.DateUp.Date <= dtTo.Date))))
                            {
                                firmno += 1;
                            }
                        foreach (var fd in dl.FirmDebits.Where(x => x.DateAdded.Date == result[i].Date && x.RateNow == 20 && x.DateAdded.Date >= ddonopl.Date))
                        {
                            prib += 20;
                        }
                        foreach (var fd in dl.FirmDebits.Where(x => x.DateAdded.Date == result[i].Date && x.RateNow == 300 && x.DateAdded.Date >= ddonopl.Date))
                        {
                            prib += 300;
                        }
                    }
 
 
                    tvig += "<td style='background-color: " + ((j == 0) ? "rgb(234, 233, 170)" : "rgb(219, 243, 172)") + ";'>" + zk + "</td><td style='background-color: " + ((j == 0) ? "rgb(234, 233, 170)" : "rgb(219, 243, 172)") + ";'>" + firmc + ((chekstatfirm.Checked == true) ? (" (<span class='fpoz'><div></div>&uArr;" + firmno + "</span> <span class='fpoz2'><div></div>&dArr;" + firmyes.Distinct().Count() + "</span> <span class='fpoz3'><div></div>&dArr;" + firmnew.Distinct().Count() + "</span>)") : "") + "</td><td style='background-color: " + ((j == 0) ? "rgb(234, 233, 170)" : "rgb(219, 243, 172)") + ";'>" + usc + "</td><td style='background-color: " + ((j == 0) ? "rgb(234, 233, 170)" : "rgb(219, 243, 172)") + ";'>" + prib + "</td>";
 
                    zkob1 += (j == 0) ? zk : 0;
                    firmob1 += (j == 0) ? firmc : 0;
                    usob1 += (j == 0) ? usc : 0;
                    prob1 += (j == 0) ? prib : 0;
                    zkob2 += (j == 0) ? 0 : zk;
                    firmob2 += (j == 0) ? 0 : firmc;
                    usob2 += (j == 0) ? 0 : usc;
                    prob2 += (j == 0) ? 0 : prib;
                }
                if (i == d + 1)
                {
                    tvig += "<td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? ((int)(zkob1 / (d + 1))) : ((int)(zkob2 / (d + 1)))) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? ((int)(firmob1 / (d + 1))) : ((int)(firmob2 / (d + 1)))) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" +
                        ((j == 0) ? ((int)(usob1 / (d + 1))) : ((int)(usob2 / (d + 1)))) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? ((int)(prob1 / (d + 1))) : ((int)(prob2 / (d + 1)))) + "</td>";
                }
                if (i == d + 2)
                {
                    tvig += "<td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? zkob1 : zkob2) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? firmallfree.Distinct().Count() : firmallpl.Distinct().Count()) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" +
                        ((j == 0) ? userallfree.Distinct().Count() : userallpl.Distinct().Count()) + "</td><td style='background-color: " + ((j == 0) ? "#C3C385" : "#B0C38A") + ";'>" + ((j == 0) ? prob1 : prob2) + "</td>";
                }
            }
 
            if (i <= d)
            {
                var rassiltext = "-";
                if (dl.EmailGroups.Any(x => x.DateAdded.Date == result[i].Date))
                {
                    rassil += 1;
                    rassiltext = dl.EmailGroups.Where(x => x.DateAdded.Date == result[i].Date).OrderByDescending(x => x.ID).FirstOrDefault().Name + " (" + dl.EmailApps.Where(x => x.DateAdded.Date == result[i].Date).Distinct().Count() + " / " + dl.EmailLinks.Where(x => x.DateAdded.Date == result[i].Date && x.Views > 0).Count() + ")";
                }
                else { }
 
 
                tvig += "<th>" + rassiltext + "</th>";
            }
            double rassik = rassil;
 
            if (i == d + 1 && d != 0)
            {
                tvig += "<th>" + ((double)(rassik / (d + 1))).ToString("0.0") + "</th>";
            }
            if (i == d + 2 || (i == 1 && d == 0))
            {
                tvig += "<th>" + (rassil) + "</thh>";
            }
 
            tvig += "</tr>";
 
        }
        vigruzka.Text += tvig + "</table>";
    }
на выходе вот что:
Вт. 17.05.16 192 23 (⇑1 ⇓0 ⇓23) 38 40 122 17 (⇑17 ⇓0 ⇓17) 28 1098 -
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2016, 01:06
Ответы с готовыми решениями:

Оптимизация. Что быстрее работает: cout или printf
Что быстрее работает: cout или printf ????????? Добавлено через 32 минуты ЕЩе вот что: Как...

Можно ли сделать так, что бы и в сети работало, и в локальном режиме?
Есть сайт www.site.ru Хотелось бы, когда я работаю вне сети, с апачи, что бы работали ссылки типа...

Стоит 4 гига. Windows7 64. Что лучше сделать,отключить часть процесса автозапуска,а какие за что отвечают не пойму, или докупить ещё планок памяти?
Не давно заметил что комп иногда &quot;притормаживает&quot;,а гаджет &quot;индикатор ЦП&quot; показывает нагрузку в тот...

Что ещё можно использовать в качестве кода сеанса?
Код сеанса - это уникальная, не обязательно не предсказуемая, не секретная числовая...

3
Эксперт .NETАвтор FAQ
9836 / 4795 / 1726
Регистрация: 11.01.2015
Сообщений: 5,975
Записей в блоге: 34
18.05.2016, 02:08 2
rs-online, Ох, ну и код
Вам нужно:
1) Выложить минимальный рабочий проект, который можно откомпилировать, запустить и увидеть тормоза. Иначе вам никто ничем конкретным не поможет. На глаз анализровать ваш код - очень тяжело, особенно учитывая то, что там сплошная вермишель.
2) Хотя по наличию массы linq-а, .Count() и .Remove(..) где ни попадя, то можно примерно догадаться отчего он тормозит.
3) А еще, нужна модель данных, разделение на осмысленные методы и т.п. На быстродействие это не повлияет, но реально ваш код - это write only code, разобраться в нем невозможно.
2
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 22
18.05.2016, 13:23  [ТС] 3
Да... код получился путанный... догадывался что никто в нем разбираться не захочет)...
про частое, без надобности, использование линью, .Count() и .Remove(..) кажется понял... - буду стараться убирать лишние обращения к массивам... где можно.

Про разделение на отдельные методы и тд тоже понял, но у меня со структурированием кода пока проблемки пока... видимо нужно почитать азы. Да и делалось на коленке для мин. статистики, выросло в большое количество искомых данных.
0
308 / 316 / 119
Регистрация: 29.10.2011
Сообщений: 1,003
18.05.2016, 19:19 4
rs-online, Профилирование даже встроенными тулами студии ответит на все ваши вопросы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2016, 19:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Что мне сделать что бы работало как надо
Почему повторяется пункт 1. Что мне сделать что бы шел пункт 2 до того что i_EnemyHealth &lt;= 0? ...

Ошибка 678:удаленный компьютер не отвечает.что это?что нужно сделать чтобы работало?
ЧТО ЭТО?КАК С ЭТИМ БОРОТЬСЯ?

Что можно еще сделать?
Подскажите пожалуйста, Уважаемые профи в SEO. Я поднимал этот вопрос, но как то наверное не до...

Что ещё можно сделать?
вопрос собственно вот в чем, ссылками меняюсь текст правильный написал но позиция в яндексе во...

Как преобразовать тип System::String ^ в string? (или что можно сделать ещё для работы перегруженного оператора ostream::operator<<)
Друзья! В обработчик события Click добавил такой код: std::ofstream file_out (&quot;file.txt&quot;);...

Что еще с сайтом можно сделать?
1. Была роизведена оптимизация под 8 слов.! много для главной страницы? 2. Обменивались ссылками...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.