![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
DimaPetrov |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 1 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код for i:=0 to Form1.ControlCount-1 do if (Form1.Controls[i] is Tdot) then begin v:=(Form1.Controls[i] as Tdot); v.left:=Trunc((v.real_X-X_tekmap)/Scale_tekMap); {1} v.top:=Trunc((v.real_Y-y_tekmap)/Scale_tekMap); {1} На Form1 находится 1000 компонентов TDot. Этот цикл выполняеться за 3 секунды. Без строки {1} 1.5, без {1} и {2} милисекунды. Как это можно ускорить? Сообщение отредактировано: DimaPetrov - 23.04.2007 5:18 |
![]() ![]() |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата На Form1 находится 1000 компонентов TDot А что это еще за компоненты такие ? Это экземпляры твоего собственного класса ? Так может тогда их проще объеденить в массив и проходить сразу по нему ? -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
hardcase |
![]()
Сообщение
#3
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
На Form1 находится 1000 компонентов TDot. Этот цикл выполняеться за 3 секунды. Без строки {1} 1.5, без {1} и {2} милисекунды. Как это можно ускорить? У тебя для каждой точки происходят вычисления с плавающей точкой, а это достаточно ресурсоёмкая процедура. А ещё, я бы сказал, что у тебя классическая задача параллелизма под данным. Если машина имеет K процессоров, то можно породить K ниток, которые преобразуют все твои точки в нужный масштаб. При большом объёме данных ускорение вычислений будет стремиться к K-раз. Всё это было бы замечательно. Еслиб не одно НО. Left, Top - это свойства? Если да, то их изменение приводит к перерисовке точки, а это дико длительная операция (относительно элементарного деления). Сообщение отредактировано: hardcase - 23.04.2007 20:36 -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Пересчет Alignment-а на время цикла отключить не пробовал (я так понимаю, у тебя компоненты визуальные)?
DisableAlign; Должно в принципе ускорить выполнение кода... |
Sergy |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
А вот эта
Цитата v:=(Form1.Controls[i] as Tdot); строчка вообще не нужна. Если уже проверил тип, то можно приводить его безусловно: Код v := Tdot(Form1.Controls[i]) Или без неё. Операция прямого явного приведения типа не выполняется в RunTime а сразу на этапе компиляции. Ещё компоненты эти твои надо заблокировать прежде чем менять их координаты. если компоненты собственного написания, то можно предусмотреть метод быстрого изменения координаты за одну, а не за две перерисовки. Ещё не ясно как они там взаимодействуют на форме. Так что мало данных для исчерпывающего ответа. |
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 15:26 |