С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Ltybcrf
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 38
1

Как ускорить работу кода, избавившись от Memo?

09.12.2016, 17:06. Просмотров 356. Ответов 7
Метки нет (Все метки)

Всем привет!

Есть у меня парсер данных со спорт сайта, так вот в нем я паршу коеффициенты (кто хоть раз делал ставки в букмекерской конторе поймет о чем я), так вот каждый спарсеный масив данных я храню в мемо, итого у меня 10 мемо на форме.

Код закончен, и встал вопрос как ускорить обработку данных в этих 10 мемо, используя обработку в памяти тстринг лист и прочее..

А теперь внимание вопрос!

Как изменить код чтобы работа кода была быстрее, пример кода ниже:

Кликните здесь для просмотра всего текста
Delphi
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
begin
          m := ss;
          mmo174.clear;
 
          b := pos('class="date', m);             /// ВЫРЕЗАЕМ ВРЕМЯ
          while b <> 0 do
          begin
            delete(m, 1, b + 0);
            mmo174.Lines.add(copy(m, 0, pos('</td>', m)));
            b := pos('class="date', m)
          end;
 
          m := mmo174.lines.text;
          mmo174.Clear;
          b := pos('>', m);             /// ЧИСТИМ ВРЕМЯ
          while b <> 0 do
          begin
            delete(m, 1, b + 0);
            mmo174.Lines.add(copy(m, 5, pos('<', m) - 5));
            b := pos('>', m)
 
          end;
 
          begin
            TS := TStringList.Create;               //Удаление пустых строк
            TS.Text := mmo174.Text;
 
            for i := TS.Count - 1 downto 0 do
              if Length(trim(TS.Strings[i])) = 0 then
                TS.Delete(i);
 
            mmo174.Text := TS.Text;
 
          end;
 
          v := mmo174.lines.count;
 
          while v <> 1 do
          begin
            mmo173.Lines.Add('');
            v := v - 1;
          end;
 
          mmo3.text := mmo3.text + mmo174.text;
 
        end;
 
        begin
          mmo175.clear;
          m := ss;
 
          b := pos('<td class="today-name">', m);             /// ВЫРЕЗАЕМ КОМАНДЫ
          while b <> 0 do
          begin
            delete(m, 1, b + 0);
            mmo175.Lines.add(copy(m, 0, pos('</div>', m)));
            b := pos('<td class="today-name">', m)
          end;
 
          m := mmo175.lines.text;
          mmo175.clear;
          b := pos('today-member-name nowrap', m);             /// ВЫРЕЗАЕМ КОМАНДЫ
          while b <> 0 do
          begin
            delete(m, 1, b + 0);
            mmo175.Lines.add(copy(m, 0, pos('<', m)));
            b := pos('today-member-name nowrap', m)
          end;
 
          m := mmo175.lines.text;
          mmo175.clear;
          b := pos('">', m);             /// ВЫРЕЗАЕМ КОМАНДЫ
          while b <> 0 do
          begin
            delete(m, 1, b + 0);
            mmo175.Lines.add(copy(m, 0, pos('<', m)));
            b := pos('">', m)
          end;
 
          s := tstringlist.create;
          s.Text := mmo175.text;                                         // замена тегов
          s.text := StringReplace(s.Text, '>', '', [rfreplaceall]);
          mmo175.Clear;
          mmo175.text := s.Text;
          FreeAndNil(s);
 
          s := tstringlist.create;
          s.Text := mmo175.text;                                         // замена тегов
          s.text := StringReplace(s.Text, '<  ', '', [rfreplaceall]);
          mmo175.Clear;
          mmo175.text := s.Text;
          FreeAndNil(s);
 
          s := tstringlist.create;
          s.Text := mmo175.text;                                         // замена тегов
          s.text := StringReplace(s.Text, '< ', '', [rfreplaceall]);
          mmo175.Clear;
          mmo175.text := s.Text;
          FreeAndNil(s);
 
          s := tstringlist.create;
          s.Text := mmo175.text;                                         // замена тегов
          s.text := StringReplace(s.Text, '<', '', [rfreplaceall]);
          mmo175.Clear;
          mmo175.text := s.Text;
          FreeAndNil(s);
 
          TS := TStringList.Create;               //Удаление пустых строк
          TS.Text := mmo175.Text;
 
          for i := TS.Count - 1 downto 0 do
            if Length(trim(TS.Strings[i])) = 0 then
              TS.Delete(i);
          mmo175.Text := TS.Text;
 
          mmo9.text := mmo9.text + mmo175.text;
        end;


Какие части кода изменить и на что помогите пожалуйста!!
просто посомтрите код что замедляет обработку? есть предложение по оптимизации?

Добавлю что сам код работает идеально, важно лишь его ускорение.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2016, 17:06
Ответы с готовыми решениями:

Как ускорить работу TreeView?
При большом количестве элементов (5 тыс.) поиск по дереву, например, по...

Delphi и DirectX или как ускорить работу с изображениями
Написал программу для штампования кадров - штампует 0,5 кадра в секунду...

Ускорить работу синапса или найти аналог
Всем привет. Столкнулся с такой проблемой, инди работает медленно. Решил взять...

Как в memo с idHTTP поместить только 2-ю половину всего кода страницы?
Пусть код определенной страницы со строками: a b c d e f g Вопрос:...

Как получить(передать) в работу только форму без кода?
Есть необходимость - получить передать на доработку только форму проекта delphi...

7
krapotkin
3493 / 3085 / 1063
Регистрация: 14.04.2014
Сообщений: 14,899
Записей в блоге: 15
09.12.2016, 17:46 2
полностью исключить мемо из алгоритма и сразу полегчает
0
Ltybcrf
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 38
09.12.2016, 18:15  [ТС] 3
Спасибо за подсказку !! О мемо я сразу и подумал но как их исключить дайте пожалуйста совет?
0
Nanotentacle
337 / 218 / 95
Регистрация: 20.10.2016
Сообщений: 1,021
09.12.2016, 19:14 4
Ltybcrf, подскажите, сколько занимает обработка? Судя по тому, что я вижу, как-то кардинально увеличить скорость работы за счет memo едва ли удастся. Я, конечно, могу ошибаться, так как с трудом представляю время обработки команд memo, но там единственным тормозом по сравнению с StringList может быть только графическая составляющая. А это, в свою очередь, означает, что все команды типа Memo.clear, Memo.lines.add и т.д. надо исключать и переносить в StringList. Memo.Clear вообще избегать, если несколькими строками ниже вы присваиваете Memo.Text := s, например.

Т.е.
Delphi
1
2
mmo175.Clear;
mmo175.text := s.Text;
уже избыточно и несет в себе лишний код.

Далее. Вот такая вот штука:
Delphi
1
2
FreeAndNil(s);
s := tstringlist.create;
на мой взгляд не менее вредная, чем Memo. Зачем полностью уничтожать StringList, с которым вы планируете работать буквально же в следующей строчке? Чистите его. Удаление и создание - затратная операция в плане времени.

Подытожим.

Вот часть кода с правками, дальше сами:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//mmo175.clear; не надо оно тут
b := pos('">', m);             /// ВЫРЕЗАЕМ КОМАНДЫ
while b <> 0 do
begin
 delete(m, 1, b + 0);
 s.add(copy(m, 0, pos('<', m))); //s вы должны создать где-то в начале процедуры, при первом обращении к нему.
 b := pos('">', m)
end;
 
//s := tstringlist.create; считаем, что стринглист вы уже создали где-то в самом начале процедуры, последовав моему совету
//s.Text := mmo175.text; строчка не нужна, мы сразу несколькими строками выше информацию забили в s
s.text := StringReplace(s.Text, '>', '', [rfreplaceall]);
//mmo175.Clear; опять неактуально. Зачем чистить Мемо, если ниже мы присваиваем ей текст?
mmo175.text := s.Text;
//FreeAndNil(s); мы используем s далее, так что забыть про удаление в середине процедуры как страшный сон
s.clear;
0
FIL
Модератор
3422 / 2556 / 728
Регистрация: 19.09.2012
Сообщений: 7,926
09.12.2016, 19:17 5
Цитата Сообщение от Ltybcrf Посмотреть сообщение
Как изменить код чтобы работа кода была быстрее
Отключение визуализации изменений на время работы с контролом немного ускорит процесс.
Delphi
1
2
3
  Memo1.Lines.BeginUpdate;
  ...
  Memo1.Lines.EndUpdate;
Но основное, думаю, - это заменить Pos на PosEx внутри циклов и тем самым избавиться от delete.

Добавлено через 1 минуту
Ну и промежуточные результаты сохранять в строку, а не Мемо.
1
DenNik
Непрофессионал
2014 / 1500 / 308
Регистрация: 26.07.2011
Сообщений: 8,138
10.12.2016, 11:03 6
выполнить рекомендацию из поста #2
Ltybcrf, просто для общего развития почитай о том, как различается скорость вывода информации в Мемо(где жутким тормозом является, как уже сказали, именно вывод на экран (технически это рисование на мониторе)) и скорость работы со строками в памяти, минуя графику.
0
AHBAR
239 / 239 / 167
Регистрация: 05.04.2013
Сообщений: 1,111
10.12.2016, 11:14 7
Цитата Сообщение от krapotkin Посмотреть сообщение
полностью исключить мемо из алгоритма и сразу полегчает
чисто гипотетически, если сначала установить Memo1.Visible := False;, а в конце алгоритма снова сделать видимым, это точно ускорит процес.
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Зачем полностью уничтожать StringList, с которым вы планируете работать буквально же в следующей строчке? Чистите его. Удаление и создание - затратная операция в плане времени.
При очистке визуальных компонентов (типа TStringGrig) память занимаемая им не освобождается. однако при удалении и создании заново - уже освобождается. Невизуальные компоненты типа TstringList освобождают память при очистке?
0
Nanotentacle
337 / 218 / 95
Регистрация: 20.10.2016
Сообщений: 1,021
10.12.2016, 11:41 8
AHBAR, процедура clear и не должна подразумевать очистку памяти. А вот Free, Destroy, FreeAndNil - подразумевает и для визуальных, и для невизуальных. И если было бы иначе, то связка
Delphi
1
2
FreeAndNil(s);
s := tstringlist.create;
приводила бы к утечке памяти при каждом выполнении.
0
10.12.2016, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2016, 11:41

Memo замедляет работу
Здравствуйте. var i: Integer; begin for i:=0 to 100000 do ...

Как сделать так, чтобы Memo появлялось поверх остальных Memo?
как сделать так чтобы memo появлялось поверх остальных memo

Вывод кода в memo
Есть переменная типа string:...


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

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

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