powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Как будет быстрее?
14 сообщений из 14, страница 1 из 1
Как будет быстрее?
    #478613
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
В TStringList нужно добавить из датасета примерно 50 тысяч элементов.
Циклом по датасету долго.
Думаю, если в DelimitedText сунуть строку из пятидесяти тысяч элементов разделенных чем-нибудь, это будет быстрее?

Понятно, что надо проверять, но может кто-то уже пробовал?
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478716
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо [игнорируется] 

Что касается добавления в StringList, то похоже, что недолго. Хотя наверное зависит и от того, какие строки добавлять.

Вот тут примерно 3 мс на стареньком Core i5-4440:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Button2Click(Sender: TObject);
var SL: TStringList;
  SW: TStopWatch;
  i: integer;
begin
  SL := TStringList.Create;
  try
    SW := TStopwatch.StartNew;
    for i := 0 to 50000 do
      SL.Add(IntToStr(i + 150000000));
    SW.Stop;
    Caption := IntToStr(SW.ElapsedMilliseconds);
  finally
    SL.Free;
  end;
end;
Может проход по датасету тормозит? Ещё, если добавление в визуальный компонент, то там свои тормоза от отрисовки. Добавляется именно в StringList или в какое-то Memo или ListBox?
...
Изменено: 12.07.2023, 10:31 - s62
Рейтинг: 0 / 0
Как будет быстрее?
    #478732
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  12.07.2023, 10:26
[игнорируется]
Может проход по датасету тормозит
скорее всего именно так.
там правда чуток сложнее, я добавлюя в стринглист самописного компонента, что как он там добавляет элементы я не знаю, это еще добавляет времени.

но я кстати проверил.
строка с разделителями точно быстрее, чем проход в цикле по датасету.
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478737
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  12.07.2023, 10:26
[игнорируется]
Добавляется именно в StringList или в какое-то Memo или ListBox?
да там у компонента метод, который принимает параметро стринглист, что он там делает с ним внутри не уверен.
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478745
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо [игнорируется] 

вот если к моему коду добавить ещё
Код: Delphi
1.
      Memo.Lines.Assign(SL);
то вот это действие - сколько-то секунд. Я как-то писал, что обнаружил, что c ListBox-ом быстрее: 365471
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478767
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо  12.07.2023, 10:44
[игнорируется]
но я кстати проверил.
строка с разделителями точно быстрее, чем проход в цикле по датасету.
Наверное ты и сам знаешь, на всякий случай напишу. Если визуальный компонент, то при добавлении по одной записи он будет перерисовываться после каждого добавления и это добавляет тормозов. Чтобы этого не было надо вначале вызвать StringList.BeginUpdate, а когда все изменения будут внесены, вызвать StringList.EndUpdate. Можно через try ... finally на случай исключения. Это реально ускоряет в случае добавления большого количества строк поочередно.
...
Рейтинг: 1 / 0
Нравится: Неуловимый Джо
Как будет быстрее?
    #478792
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  12.07.2023, 11:07
[игнорируется]
Неуловимый Джо  12.07.2023, 10:44
[игнорируется]
но я кстати проверил.
строка с разделителями точно быстрее, чем проход в цикле по датасету.
Наверное ты и сам знаешь, на всякий случай напишу. Если визуальный компонент, то при добавлении по одной записи он будет перерисовываться после каждого добавления и это добавляет тормозов. Чтобы этого не было надо вначале вызвать StringList.BeginUpdate, а когда все изменения будут внесены, вызвать StringList.EndUpdate. Можно через try ... finally на случай исключения. Это реально ускоряет в случае добавления большого количества строк поочередно.
ну тут остается надеяться что в компоненте это учтено.
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478809
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо  12.07.2023, 11:28
[игнорируется]
ну тут остается надеяться что в компоненте это учтено.
Почему? Ты же передаешь в процедуре в какой-то StringList. Вот у него и можно вызвать в начале BeginUpdate, а в конце EndUpdate.
Типа
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure SendArrayToStringList(Arr: array of integer; SL: TStringList);
begin
  SL.BeginUpdate;
  try
    SL.Clear;
    for i := 0 to High(Arr) do
      SL.Add(IntToStr(Arr[i]);
  finally
    SL.EndUpdate;
  end;
end;
...
Изменено: 12.07.2023, 11:45 - s62
Рейтинг: 0 / 0
Как будет быстрее?
    #478810
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  12.07.2023, 11:43
[игнорируется]
Неуловимый Джо  12.07.2023, 11:28
[игнорируется]
ну тут остается надеяться что в компоненте это учтено.
Почему? Ты же передаешь в процедуре в какой-то StringList. Вот у него и можно вызвать в начале BeginUpdate, а в конце EndUpdate.
Типа
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure SendArrayToStringList(Arr: array of integer; SL: TStringList);
begin
  SL.BeginUpdate;
  try
    SL.Clear;
    for i := 0 to High(Arr) do
      SL.Add(IntToStr(Arr[i]);
  finally
    SL.EndUpdate;
  end;
end;
да его я тут же и создаю, на нем никаких отрисовок точно нет.
...
Рейтинг: 0 / 0
Как будет быстрее?
    #478968
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62 [игнорируется] 

С DelimitedText тоже проблемы.
там делиметр можно только один символ, и найти подходящий трудно.

Пока не нашел )
...
Рейтинг: 0 / 0
Как будет быстрее?
    #479003
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо [игнорируется] 

Можно присвоить свойство Text и разделять строки символами CR LF.
Вроде так должно сработать:
Код: Delphi
1.
2.
3.
4.
s := '';
for i := 0 to High(StrArr) do
  s := s + StrArr[i] + #13#10;
StringList.Text := s;
...
Изменено: 12.07.2023, 14:26 - s62
Рейтинг: 0 / 0
Как будет быстрее?
    #479103
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
s62  12.07.2023, 14:16
[игнорируется]
Неуловимый Джо [игнорируется] 

Можно присвоить свойство Text и разделять строки символами CR LF.
Вроде так должно сработать:
Код: Delphi
1.
2.
3.
4.
s := '';
for i := 0 to High(StrArr) do
  s := s + StrArr[i] + #13#10;
StringList.Text := s;
ок, спасибо, проверю )
...
Рейтинг: 0 / 0
Как будет быстрее?
    #479109
Неуловимый Джо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
не, не подходит, эта последовательность встречается в строках )
ладно, в принципе и хрен с ним.
...
Рейтинг: 0 / 0
Как будет быстрее?
    #479111
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуловимый Джо  12.07.2023, 15:02
[игнорируется]
не, не подходит, эта последовательность встречается в строках )
ладно, в принципе и хрен с ним.
Ну кстати говоря, если в очередной строке есть символы перевода каретки и новой строки, то по идее в StringList при ее добавлении она добавится как две строки (два элемента StringList).
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Как будет быстрее?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]