Текущий архив: 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