Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#91: 2009-11-05 14:00:42 ЛС | профиль | цитата
nesco писал(а):
Гы. Вот это бред. См. внимательно
Видел я все это.
Тормоз вот здесь
nesco писал(а):
Control.Add(List.Items[i]);
но я не смог найти где оно спрятано.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#92: 2009-11-05 14:17:31 ЛС | профиль | цитата
Tad, попробовал заменить Add на Insert, удалось выдавить 0,5 sec, при загрузке файла 1,8 Мб за 6 сек
карма: 22

0
Ответов: 5446
Рейтинг: 323
#93: 2009-11-05 14:20:10 ЛС | профиль | цитата
Microsoft рекомендует делать WM_SETREDRAW перед массовым добавлением элементов в ListBox.
карма: 1

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#94: 2009-11-05 14:51:30 ЛС | профиль | цитата
iarspider писал(а):
Microsoft рекомендует...

Попробовал, удалось выдавить еще секунду из 6 сек, те -- 5 сек, но на экране ничего не видел до окончания загрузки

Тормоза находятся вот в этом сообщении -- LB_INSERTSTRING
карма: 22

0
Гость
Ответов: 17029
Рейтинг: 0
#95: 2009-11-05 15:41:42 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-22 09:21:46
карма: 0

0
Разработчик
Ответов: 26153
Рейтинг: 2127
#96: 2009-11-05 15:43:28 ЛС | профиль | цитата
Нашел выход из положения -- SendMessage(Control.Handle, LB_INITSTORAGE, 0, 104857600). В разы ускоряет быстродействие (при выделенных 100 Мб)
------------ Дoбавленo в 16.22:
Короче, вот такой метод doLoad, добавленный в ListBox, загружает файл в 1,8 Мб за 0,27 сек, вместо 6,5 сек раньше.


procedure THIListBox._work_doLoad;
var
fn:string;
Lst:PStrList;
i:integer;
begin
fn := ReadString(_Data,_data_FileName,_prop_FileName);
if FileExists(fn) then
begin
Control.Perform(WM_SETREDRAW, 0, 0);
Control.Clear;
Lst := NewStrList;
Lst.LoadFromFile(fn);
if Lst.Count = 0 then exit;
Control.Perform(LB_INITSTORAGE, 0, Length(Lst.Text));
for i := 0 to Lst.Count - 1 do
Control.Perform(LB_ADDSTRING, 0, cardinal(PChar(Lst.Items[i])));
Lst.Free;
Control.Perform(WM_SETREDRAW, 1, 0);
_hi_CreateEvent(_Data,@_event_onChange);
end;
end;

Что делать будем
------------ Дoбавленo в 16.50:
Немного ускорил
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#97: 2009-11-05 16:54:19 ЛС | профиль | цитата
nesco писал(а):
Что делать будем
Вопрос к кому ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#98: 2009-11-05 16:55:49 ЛС | профиль | цитата
Tad писал(а):
Вопрос к кому ?

К начальнику транспортного цеха, он просил с ним советоваться в данном вопросе, Я на себя не готов брать такую ответственность, как исправление без обсуждения с руководством
------------ Дoбавленo в 16.57:
Кстати, аналогично делается метод doText. Замечен интересный момент -- скорость намного быстрее в основном потоке, в дополнительном -- меньше
------------ Дoбавленo в 19.30:
Tad писал(а):
Блокнот за 50 секунд

Последняя проверка показала, что файл размером 117 Мб у меня считался за... 12 сек, 54 Мб -- за 3 сек, тут, видимо, система память пожалела и не всю требованную выделила
карма: 22

0
Ответов: 5446
Рейтинг: 323
#99: 2009-11-05 19:56:50 ЛС | профиль | цитата
nesco, в выложенном коде сразу вижу логическую ошибку: при Lst.Count = 0 не происходит включение отрисовки (WM_SETREDRAW 1). Советую всю работу с Control перенести после загрузки списка из файла.
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#100: 2009-11-05 20:12:13 ЛС | профиль | цитата
Да, впечатляет: Файл на 800 000 строк загрузился за 10 сек, а раньше 43 минуты !
Как говорят на Украине: Цэ вжэ похожэ на людэй
------------ Дoбавленo в 20.50:
nesco писал(а):
Tad писал(а)Блокнот за 50 секунд

Ещё
Tad писал(а):
Lister TC открывает мгновенно
так что резервы ещё где-то есть.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#101: 2009-11-05 23:13:40 ЛС | профиль | цитата
iarspider писал(а):
в выложенном коде сразу вижу логическую ошибку

Гы, это -- прототип. Я уже заметил эту ошибку раньше, там еще одна грубая ошибка есть -- при Lst.Count = 0 не происходит очистка списка

Вот, мой последний рабочий вариант

-- удалено -- См. ниже

------------ Дoбавленo в 23.24:
Tad писал(а):
так что резервы ещё где-то есть

Вряд ли. Скорее всего, Lister использует виртуальный список
карма: 22

1
Голосовали:Tad
Ответов: 16884
Рейтинг: 1239
#102: 2009-11-05 23:41:11 ЛС | профиль | цитата
Себе исправил, 10 сек против 43 минут - это вроде и принять можно
Остались остальные визуалки с точкой doLoad.
Впереди выходные. Грузим
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#103: 2009-11-05 23:55:58 ЛС | профиль | цитата
Tad писал(а):
Впереди выходные

Там нет таких функций, я уже искал
Сделай код лучше так, без списка, но в этом случае, не кисло экономится память, практически, при той же скорости

-- удалено -- См. ниже

------------ Дoбавленo в 00.33:
Немнго подправил код
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#104: 2009-11-06 01:03:49 ЛС | профиль | цитата
Сделал. Тех же 10 сек. ОК.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26153
Рейтинг: 2127
#105: 2009-11-06 01:06:27 ЛС | профиль | цитата
Tad писал(а):
Тех же 10 сек. ОК

А память как потребляется, не проверял, в динамике
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)