Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15294
Рейтинг: 1518
#1: 2007-11-25 18:44:37 ЛС | профиль | цитата
   Оказалось, что скрестить чрезвычайно удачный объектно ориенторованный подход стандартного классического пакета Delphi с новыми методами генерации практически 100% оптимального кода(FTCG) не так сложно. Для осуществления этой задачи в пакет Delphi был инжектирован кодогенератор пакета Delphi 2, генерирующий код при вставки в схему специального элемента - шлюза: [svn]FTCG_Tools.pas[/svn]. Все элементы, вставленные внутрь него(он очевидно является контейнером) генерируют очень быстрый и полностью оптимальный код, врезультате чего скорость работы схем в критических местах возрастает более чем в 10 раз.

   Следующий пример на процессоре Athlon 1900Мгц выполняется примерно за 14.629 секунд:
code_7788.txt

а таже самая схема, помещенная внутрь FTCG_Tools дает уже в среднем 0.013 секунд... т.е. не много не мало, а в 1000 раз быстрее:
code_7789.txt

   Для запуска последнего примера на своей машине необходимо:
1) Скачать с SVN папку FTCG
2) Обновить полностью папку Delphi
3) Запустить make.bat из папки Delphi

Редактировалось 1 раз(а), последний 2016-08-23 20:48:52
карма: 26
0
файлы: 2code_7788.txt [1KB] [1411], code_7789.txt [1KB] [1431]
vip
#1.1контекстная реклама от партнеров
Администрация
Ответов: 15294
Рейтинг: 1518
#2: 2007-11-25 20:55:06 ЛС | профиль | цитата
Вячеслав, если у элемента есть в папке code соответствующий *.hws, то его можно использовать.

Так же стоит еще раз подчеркнуть - код в рамках данного элемента генерирует FTCG и этот процесс абсолютно ничем не отличается от того, что происходит в пакетах WEB и Delphi 2.

И наконец в рамках данного пакета имеет смысл "портировать" только часть элементов палитры, использование которых критично к скорости выполнения программы. В основном это элементы вкладок Массивы, Строки, Инструменты и Логика.
карма: 26
1
Голосовали:VAD
Ответов: 262
Рейтинг: 6
#3: 2007-12-05 08:52:01 ЛС | профиль | цитата
Dilma, из прочитанного выше я понял, что основная идея, в создании для критичных элементов FTCG дубликата .hws. При помещении такого элемента в FTCG_Tools автоматически .pas вариант заменяется на .hws. Так как это сделано например с элементом hiGL_Cube. Единственное не понятно почему часть элементов была названа с префиксом FT и выделена в отдельную вкладку. Почему сделан отдельный hiFT_Message.hws, когда по логике должен быть просто hiMessage.hws? То же самое и с другими элементами hiFor и hiFT_For и пр.
--
В файле hiStrArray.hws c SVN на самом деле текст на паскале.
Цепочка FT_If_else -> onFalse -> FT_if_else генерирует нерабочий код "end; else if".
По ctrl+f тексты .hws элементов не открываются.
карма: 0

0
Администрация
Ответов: 15294
Рейтинг: 1518
#4: 2007-12-05 10:46:49 ЛС | профиль | цитата
Chesh, стандартные элементы было единогласно решено представлять отдельными элементами палитры по двум основным причинам:
1) не все элементы палитры имеет смысл выносить в FTCG - какие-то не дадут прироста скорости, а какие-то там вовсе смысла не имеют
2) из тех, что туда вынесены многие поменяют(или уже поменяли) интерфейс и часть функциональности

OpenGL теоритически возможно перенести на FTCG полностью и без изменений как интерфейсных, так и функциональных. Делать еще одну копию вкладки видимо не очень рационально.

По остальным вопросам: технология проходит стадию внедрения.

карма: 26
0
Администрация
Ответов: 15294
Рейтинг: 1518
#5: 2007-12-05 12:22:09 ЛС | профиль | цитата
По большому счету с учетом этого внезапно открытого факта производство "чистых" пакетов на базе FTCG для объектно ориентированных языков смысла не имеет. Тут мы получаем возможность проектировать элементы как высокого уровня(с большим количеством кода целевого языка), отлаживаемые как в hiasm так и вне его, так и компоненты низкого уровня, чья эффективность резко падает при объектно ориентированном подходе. Кроме того разработчик получает возможность самостоятельно выбирать способ создания нового элемента в зависимости от свои знаний и способностей. Не исключено так же его последовательное обучение и постепенный переход от схемы, к диалекту целевого языка и наконец к синтаксису промежуточного скрипта HWS.
карма: 26
0
Главный модератор
Ответов: 2997
Рейтинг: 395
#6: 2007-12-07 10:41:11 ЛС | профиль | цитата
Получил разницу в 1000 раз, но сразу наступил на грабли: порядок свойств Start и End на панеле у компонентов For и FT_For разный.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Администрация
Ответов: 15294
Рейтинг: 1518
#7: 2007-12-09 15:58:59 ЛС | профиль | цитата
Nic писал(а):
порядок свойств Start и End на панеле у компонентов For и FT_For разный

это изменение обусловлено тем, что св-во End переопределяется гораздо чаще, чем Start.

------------ Дoбавленo:


Пример, демонстрирующий работу с BASS Stream в рамках FTCG. Показан простейших способ микширования двух синусоид различной частоты и амплитуды. В процессе выполнения пиковая нагрузка на процессор составила ~2-3%, что в 10 раз меньше, чем при выполнение схемы на стандартных элементах палитры. Кроме того наращивание ф-ности в FTCG не приведет к существенному увеличению нагрузки на CPU.


в архиве есть EXE
карма: 26
0
файлы: 2stream_mix.rar [42.3KB] [707], mixer.png [5.9KB] [1014]
Ответов: 2057
Рейтинг: 28
#8: 2007-12-09 17:08:46 ЛС | профиль | цитата
Dilma, а когда следующий билд примерно будет? Хочеться то же посмотреть на этого зверя (FTCG).
карма: 1

0
Администрация
Ответов: 15294
Рейтинг: 1518
#9: 2007-12-09 17:37:08 ЛС | профиль | цитата
Для ознакомления достаточно выполнить три пункта из первого поста
карма: 26
0
Ответов: 2057
Рейтинг: 28
#10: 2007-12-09 18:36:41 ЛС | профиль | цитата
Dilma писал(а):
Для ознакомления достаточно выполнить три пункта из первого поста

Не выходит у меня. Придёться ждать очередного билда. Кстате почему нет файла Elements.db ? Это нармально? Вместо него Elements.sql.
карма: 1

0
Ответов: 5446
Рейтинг: 323
#11: 2007-12-09 19:53:40 ЛС | профиль | цитата
Эдик, ты форум весь читай, уже обсуждали и даже утилиту выкладывали, чтобы из sql сделать db
карма: 1

0
Ответов: 184
Рейтинг: 4
#12: 2007-12-14 02:44:11 ЛС | профиль | цитата
Маленький вопрос по FTCG: допустим я переписал компонент PointXY под FTCG и получил вот это:
hiFT_PointXY.hws:

func Init()
if(linked(doPoint) and linked(Point))
lang(p:int)
lng.decl_priv_var(p, 'integer')
end
end

func doPoint(data)
fvar(X_)
X_ = X
if(linked(Point))
println(p, ' := ', '(' && Y && ' shl 16 + ' && X_ && ')', ';')
event(onPoint, p)
else
event(onPoint, '(' && Y && ' shl 16 + ' && X_ && ')')
end
end

func Point(data)
if(linked(doPoint))
return(p)
else
return('(' && Y && ' shl 16 + ' && X && ')')
end
end
hiFT_pointXY.ini:

#ini
[About]
Version=1.1
Author=Dilma
Mail=hiasm@mail.ru

[Type]
Class=Element
Info=Формирование точки по её координатам
Tab=FTCG

[Property]
X=Координата X точки|1|0
Y=Координата Y точки|1|0

[Methods]
doPoint=|1|1
onPoint=|2|1
Point=Возвращает точку в формате Y*65536 + X|3|1
X=Координата X точки|4|1
Y=Координата Y точки|4|1
Скрипт по моей задумке должен работать так: если используются обе точки doPoint и Point то должна создаваться новая переменная с результатом вычисления точки и по onPoint и в Point возвращается эта переменная, иначе возвращается формула.
Вопрос: правильно ли я всё записал в hws (нет ли чего лишнего) и будет ли компонент всегда работать так как задумано
карма: 1
Статус строка какая-то, сейчас посмотрім: %time%
0
Администрация
Ответов: 15294
Рейтинг: 1518
#13: 2007-12-14 12:46:14 ЛС | профиль | цитата
HuKTO, во-первых, есть сомнение, что компонент стоит делать именно так. Все же не стоит забывать, что мы работаем в рамках FTCG. Для примера советую посмотреть Point3D из OpenGL. Представление ввиде формулы - это затычка придуманая во времена, когда не было МТ.

В целом же скрипт написан верно, разве что X_ = X можно убрать
карма: 26
0
Ответов: 184
Рейтинг: 4
#14: 2007-12-15 13:46:08 ЛС | профиль | цитата
Понял, пошёл смотреть...

P.S. По поводу X_ = X: сглупил, в пол третьего ночи иногда многое не доходит
------------ Дoбавленo:

С point понятно. Ещё один вопросик. Попробовал переписать IndexToChanel:

func doEvent(_data)
fvar(i)
println('case ', Index, ' of')
for(i = 1; i <= _event_count_; i++)
if(linked("onEvent" + i))
print(i - 1, ': ')
lng.begin()
if(linked(Data))
event("onEvent" + i, Data)
else
event("onEvent" + i)
end
lng.end()
end
end
println('end;')
end
Но вот на это
linked("onEvent" + i)
получаю вот это
Ошибка чтения аргументов linked: ожидается символ )

Как проверить, подцеплено ли событие? Или я опять не там копаю?
карма: 1
Статус строка какая-то, сейчас посмотрім: %time%
0
Ответов: 9906
Рейтинг: 351
#15: 2007-12-15 14:14:41 ЛС | профиль | цитата
1) Аргумент linked есть токен а не выражение
2) Я уже извращаелся на этот предмет (IndexToChanel) - посмотри по форуму
3) linked - вовсе не есть гарантия отсутствия кода
------------ Дoбавленo:

Вот вроде http://hiasm.com/forum.html?q=3&p=60840#p60840
карма: 9

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