Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

TreeNode.AbsoluteIndex работает очень медленно :)   Найти похожие ветки 

 
Piter ©   (2006-02-06 02:15) [0]

Писал тут программу, случайно обнаружил...

В общем, программа парсит строки, и каждому найденному элементу ставится в соответствие ветка TTreeView. Допустим, найдена очередная подстрока Substr, происходит:

MyObj.AddStr(Substr, Node.AbsoluteIndex);

Так вот ломал я сначала голову - почему же так медленно... Оказывается, операция Node.AbsoluteIndex кошмарно медленная! Если, допустим, во всей программе всего лишь заменить вышеприведенную строчку на:

MyObj.AddStr(Substr, Node.Index);

То программа отрабатывает раз в 5 быстрее. Не за 5 секунд, а за где-то 1. Конечно, так не совсем верно использовать Index по логике, это просто для примера.

Конечно, может все знают об этом, но вот решил поделиться :)

Мне-то повезло, я ошибся и сначала использовал Node.Index, увидел реальную скорость выполнения программы. Потом переправил на Node.AbsoluteIndex и словил такие тормоза, быстро понял что к чему...
А вот если бы сразу использовал Node.AbsoluteIndex - думаю, доооолго бы думал, что же так медленно работает...

Конечно, постоянным вызовом даже простой операции можно затормозить программу, но ведь у меня парсится строка. На каждое вычленение подстроки приходился один вызов Node.AbsoluteIndex, как видно - вычленение строки происходил раз в 5 быстрее, чем Node.AbsoluteIndex.
Меня это удивило, очень неоптимально.

Ну я причину быстро понял и все скешировал, так как на разные вычленения строк зачастую приходился один и тот же вызов Node.AbsoluteIndex.

А тем, кто не знает такого поведения TreeView - может, пригодится...


 
Piter ©   (2006-02-06 11:27) [1]

Все и так знали...
Я так и знал :) А мне не сказали...


 
Gero ©   (2006-02-06 11:33) [2]

Юзайте TVirtualTreeview и будет вам счастье.


 
kaZaNoVa ©   (2006-02-06 11:39) [3]

а в чем заключается вопрос?))
как ускорить? - повысить приоритет программы :)


 
jack128 ©   (2006-02-06 11:53) [4]

Piter ©   (06.02.06 2:15)
дело не в самом AbsoluteNodeIndex , а в медлительности метода
function TTreeNodes.GetNode(ItemId: HTreeItem): TTreeNode;
Именно он вносит самые сильные тормоза во все методы TCustomTreeView.


 
kaZaNoVa ©   (2006-02-06 12:17) [5]

jack128 ©   (06.02.06 11:53) [4]
а почему он медлителен?


 
jack128 ©   (2006-02-06 12:24) [6]

kaZaNoVa ©   (06.02.06 12:17) [5]

Спроси у Билли


 
Piter ©   (2006-02-06 12:34) [7]

kaZaNoVa ©   (06.02.06 11:39) [3]
повысить приоритет программы


спорим, что быстродействие даже на 5% не повысится?

jack128 ©   (06.02.06 12:24) [6]
Спроси у Билли


а Билли то тут при чем? :)
Вроде Borland дружит с Билли, конечно, но теперь на него еще и их грехи скидывать? :)

Кстати, там судя по коду используется некая буферизация тоже, кеш. А толку что-то нет.


 
jack128 ©   (2006-02-06 12:58) [8]

Piter ©   (06.02.06 12:34) [7]
Кстати, там судя по коду используется некая буферизация тоже, кеш. А толку что-то нет.


ну кеш там помогает при последовательном переборе узлов for i := 0 to TV.Items.Count - 1 do TV.Items[I].DoSomething;
А еще для интереса посмотри как реализован GetLastChild, который используется в GetPrev , который используется в GetAbsoluteIndex. Как понимаешь, при такой реализации для того чтобы вычислить абсолютный индекс нужно ДВАЖДЫ пробежаться по дереву.

Piter ©   (06.02.06 12:34) [7]
но теперь на него еще и их грехи скидывать?

ну а на кого скидывать огрехи, если данные ассоцированные с объектом пол часа получать приходится? В VST подобное действо реализуется так:  
 Data := PUserData(PChar(Node) + UserDataOffset)^;   И это летает. Чего делает билли в TreeView_GetItem я не знаю и знать не хочу, но работает эта функция не позволительно медленно (для более менее больших деревьев)
PS А еще в VST LastChild - хранимое, а не вычисляемое значение ;)


 
kaZaNoVa ©   (2006-02-06 14:42) [9]

Piter ©   (06.02.06 12:34) [7]

> спорим, что быстродействие даже на 5% не повысится?

смотря при каких условиях ..  может и так быть ......


 
Piter ©   (2006-02-06 19:46) [10]

Ох мать моя... А какой же тормозной метод AddChild !!!!!

Вот AddChildFirst еще более менее! С ним выполнение идет около 2-ух секунд..

Замена AddChildFirst на AddChild увеличивает время выполнения до 40-50 секунд!!!! В 20 раз... это ужас.

но мне не надо задом наперед добавлять :(
Неужели нет никакого способа пролечить TTreeView...

Пошел за TVirtualTreeview... а то иначе тихий ужас...


 
Ломброзо ©   (2006-02-06 20:20) [11]

А эта... BeginUpdate()-EndUpdate() используется? Если пользовать дерево без этих функций - после каждого добавления узла происходит ещё и полная перерисовка дерева.


 
Piter ©   (2006-02-06 22:47) [12]

Ломброзо ©   (06.02.06 20:20) [11]
А эта... BeginUpdate()-EndUpdate() используется?


да, конечно, пользуется. И вот представь - такие дикие результаты...

Замена AddFirstChild на AddChild замедляет работу с 2-ух секунд до 50 секунд!!!!

То есть, в начало он еще нормально добавляет, а вот в конееец...

VST проблему решил! Штука замечательная (хотя не понимаю зачем так было Data делать), но и занимает блин... Из-за одного TreeView приложение разрослось от 450 до 800 Kbyte из-за этого :(


 
jack128 ©   (2006-02-06 23:36) [13]

Piter ©   (06.02.06 22:47) [12]
хотя не понимаю зачем так было Data делать

Экономия 4 байт памяти ;)


 
Piter ©   (2006-02-06 23:47) [14]

Присмотрелся я к UKCable, а он список файлов в файл-листе хранит задом наперед! :))

Видимо, для того, чтобы как раз при считывании использовать AddFirstChild :)))

У C++ такие же проблемы... Да, дядя Билли недоглядел чего-то...

jack128 ©   (06.02.06 23:36) [13]

:()



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.101 c
2-1139506864
nirvana
2006-02-09 20:41
2006.02.26
Очень ажный вопрос по DBCombobox или DBListEdit


2-1139558231
Id
2006-02-10 10:57
2006.02.26
Вертикальная надпись в QReport


15-1139136957
Volf_555
2006-02-05 13:55
2006.02.26
Как восстановить контекстное меню для файлов!?


1-1138169327
dreamse
2006-01-25 09:08
2006.02.26
Цикл между двумя датами


15-1139406897
RDA
2006-02-08 16:54
2006.02.26
Ну вот и все. Борланд нас покидает?