Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#136: 2009-11-07 15:25:05 ЛС | профиль | цитата
Tad писал(а):
При /1 на выходе строки не будет

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

0
Администрация
Ответов: 15295
Рейтинг: 1519
#137: 2009-11-07 22:51:37 ЛС | профиль | цитата
nesco, есть подозрение, что переписывание doLoad и doText для ListBox не есть самое оптимальное решение. Почему это нельзя было сделать в THIWinList?
------------ Дoбавленo в 22.55:
еще небольшая просьба не оставлять задач вида
Есть предложение по существенному ускорению загрузки текста по doLoad и doText

если нет времени дать нормальное описание, то нужно сопровождать свое сообщение ссылкой на топик, где это описание можно найти.
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#138: 2009-11-08 00:13:42 ЛС | профиль | цитата
Вау! Наконец-то. Dilma ответил.

Dilma писал(а):
если нет времени дать нормальное описание

Да я там и не видел нормальных, развернутых описаний, а потому и посчитал, что надо написать кратко. Вот со ссылкой да, я упустил, в следующий раз писать обязательно буду. А вообще-то это должно касаться всех в равной мере, которые в bugtracker пишут

Почему я не сделал в THIWinList-e, тут могу сказать только одно -- метод doText еще можно туда перенести, но вот doLoad, в том виде, в котором он есть сейчас не получится никак, по причине того, что LB_INITSTORAGE работает только для класса ListBox, а он и дает огромный прирост скорости. Для doLoad можно сделать то же, но только без выделения буфера: ускорит в несколько раз но не на порядки.

Если ты не будешь против, то я приведу эти методы в THIWinList к нужнму виду и тогда выложу.
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#139: 2009-11-08 17:01:22 ЛС | профиль | цитата
nesco писал(а):
но вот doLoad, в том виде, в котором он есть сейчас не получится никак, по причине того, что LB_INITSTORAGE работает только для класса ListBox

почему же не получится? В базовом классе делается метод для всех листов. В классе для ListBox он перекрывается с таким кодом:
#pas
procedure doLoad(const fn:string);
begin
if FileSize(fn) > MAX_PATH*100 then LB_INITSTORAGE;
inherited doLoad(fn);
end;
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#140: 2009-11-08 17:19:34 ЛС | профиль | цитата
Dilma писал(а):
В базовом классе делается метод для всех листов. В классе для ListBox он перекрывается с таким кодом:

Не работает, я уже проверял. Вызов нужно делать только перед самим добавлением, иначе, любое обращение к очереди возвращает память на место. Вот так можно сделать в WinList-e, и это работает для обоих методов: и doText, и doLoad


procedure THIWinList.SetStrings;
var
List:PStrList;
i:integer;
aName: array [0..255] of Char;
begin
Control.Perform(WM_SETREDRAW, 0, 0);
List := NewStrList;
List.SetText(Value, false);
Control.Clear;
if List.Count > 0 then
begin
GetClassName(Control.Handle, aName, 256);
if string(aName) = 'obj_LISTBOX' then
begin
Control.Perform(LB_INITSTORAGE, 0, Length(List.Text));
for i := 0 to List.Count - 1 do
Control.Perform(LB_ADDSTRING, 0, cardinal(PChar(List.Items[i])));
end
else if string(aName) = 'obj_COMBOBOX' then
begin
Control.Perform(CB_INITSTORAGE, 0, Length(List.Text));
for i := 0 to List.Count - 1 do
Control.Perform(CB_ADDSTRING, 0, cardinal(PChar(List.Items[i])));
end
else
for i := 0 to List.Count-1 do
Control.Add(List.Items[i]);
end;
List.free;
Control.Perform(WM_SETREDRAW, 1, 0);
end;
------------ Дoбавленo в 17.25:
Dilma писал(а):
В базовом классе делается метод для всех листов

Тоже не катит. Не хотят с таким изменением нормально работать классы Edit, работают нормально только тогда, если не менять главный алгоритм
карма: 22

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#141: 2009-11-09 02:26:21 ЛС | профиль | цитата
Детально еще раз проверил. Удалось запустить на перекрытых методах, вроде, работает, но результат хуже, предложенного мной, в два раза. Да еще и код появляется в компонентах, а так ничего не надо.
А теперь объясни мне, чем перекрытие лучше исправления, всего одного, метода
Достигнутые результаты, весьма, неплохие -- парсирование файла 10,9 Мб с добавлением результата в ListBox -- 298 мсек
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#142: 2009-11-09 15:51:02 ЛС | профиль | цитата
если перегрузку делать так, как приведено в коде выше, то ничем не лучше. Если же ее делать так, как надо, то это дает гораздо больше гибкости для наращивания палитры в будущем, поскольку разработчику остается только переписать куски кода специфичные для его элемента не трогая основной отлаженный проверенный и оптимизированный алгоритм.
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#143: 2009-11-09 17:29:33 ЛС | профиль | цитата
Dilma писал(а):
оптимизированный алгоритм

Я в корне не согласен с существующим алгоритмом doLoad и doText в WinList-e

1. Зачем применять дважды doClear для контрола
2. MSDN настоятельно реомендует убирать отрисовку при создании больших списков, раньше, этого не было

Dilma писал(а):
поскольку разработчику остается только переписать куски кода специфичные для его элемента не трогая основной отлаженный проверенный и оптимизированный алгоритм


В принципе, замена специфичных функций для боксов, вполне можно заменить простым Add, потеря в быстродействии будет не сильно большая, но вот то, что перекрвтие отнимает существенное быстродействие, мне не сильно понятно, за счет чего, попробую проверить на файлах большего размера, возможно, потеря соизмерима с быстродействием на маленьких объемах

Dilma писал(а):
Если же ее делать так, как надо

А как надо, твои рекомендации -- так как ты написал выше, или как-то еще можно
------------ Дoбавленo в 17.42:
Или, все же, перекрыть полностью эти методы в боксах, оптимизировав их по-максимому, не трогая сам WinList
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#144: 2009-11-09 18:35:55 ЛС | профиль | цитата
Dilma писал(а):
поскольку разработчику остается только переписать куски кода специфичные для его элемента не трогая основной отлаженный проверенный и оптимизированный алгоритм.
алгоритм, который загружает файл за 43 минуты вместо 10 секунд ?

Dilma, извините и без обид. Никак не могу понять: HiAsm с пакетами предназначен для разработчиков или для пользователей ?

Dilma писал(а):
делать так, как надо
а как это?
------------ Дoбавленo в 18.38:
nesco опередил.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Администрация
Ответов: 15295
Рейтинг: 1519
#145: 2009-11-09 19:14:18 ЛС | профиль | цитата
господа, прошу привести цитату или ссылку на сообщение, где говорится о том, что существующий(или ранее существовавший) код обсуждаемых методов является самым оптимальным.
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#146: 2009-11-09 19:17:39 ЛС | профиль | цитата
Dilma писал(а):
не трогая основной отлаженный проверенный и оптимизированный алгоритм

Мне показалось, что это относится к существующему. Извини, если я не так тебя понял. Но я корректно написал, что с существующим я не согласен, ожидая дальнейших обсуждений, как сделать луше
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#147: 2009-11-09 19:19:03 ЛС | профиль | цитата
Я такой ссылки не знаю.
Да и утверждение, что какой-то код является оптимальным - это из области фантастики.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#148: 2009-11-09 19:20:57 ЛС | профиль | цитата
Dilma, а можно более конкретные предложения по усовершенствованию, а то виртуально, я за твоими идеями не поспеваю
карма: 22

0
Администрация
Ответов: 15295
Рейтинг: 1519
#149: 2009-11-10 16:31:16 ЛС | профиль | цитата
nesco писал(а):
что с существующим я не согласен

с существующим кодом по загрузки текста только безумец может согласится

nesco писал(а):
а можно более конкретные предложения по усовершенствованию

чуть попозже покажу реализацию, которую хотелось бы иметь с учетом последних исследований
------------ Дoбавленo в 16.30:
внес правки для ListBox и ComboBox. В сравнении с последней конфигурацией скорость увеличилась еще в 2-3 раза.
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#150: 2009-11-10 17:21:36 ЛС | профиль | цитата
Dilma писал(а):
В сравнении с последней конфигурацией скорость увеличилась еще в 2-3 раза

Очень, даже -- хорошо
------------ Дoбавленo в 17.30:
Dilma, проверил, посмотрел. Срочно убери вот это из WinList-a для контролов класса Edit, мы ускорили одно, но убили другое, я писал про это уже, что этот метод катит только для боксов. Лучше это перенести в сами боксы. Раньше Мемо читал за 1,5 сек 11 Мб файл, теперь, я замучался ждать, когда он считает


     begin
hFile := CreateFile(PChar(fn), GENERIC_READ OR GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
fsz := GetFileSize(hFile, nil);
CloseHandle(hFile);

if fsz <> 0 then
begin
SetStringsBefore(fsz);
AssignFile(F, fn);
Reset(F);
SetTextBuf(F, BufIn);
while not eof(F) do
begin
Readln(F, s);
Add(s);
end;
CloseFile(F);
SetStringsAfter;
end;
_hi_CreateEvent(_Data,@_event_onChange);
end;
карма: 22

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