hype3

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

hype3

ygrek-3
Привет,

При статическом вызове метода снаружи класса - т.е. так

CLASS class : hello ." HELLO" CR ; ;CLASS
class NewObj VALUE obj
obj :: class.hello

компилируется вызов не напрямую CALL, а через SEND.
Понятно что надо переключать SELF, но вызов при этом идёт косвенный -
через CALL регистр. Можно ли в принципе немножко соптимизировать т.к.
на этапе компиляции вся информация про обьект доступна?

Можно было бы сдвинуть внутреннюю структуру обьекта так чтобы сами
данные начинались по смещению ноль, а дополнительная ячейка в -CELL
Удобнее будет брать размер обьекта или давать адрес на его
внутренности, когда это зеркало какой-нибудь структуры API например CRect.

--

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev

attachment0 (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: hype3

Dmitry Yakimov-2
ygrek wrote:

> Привет,
>
> При статическом вызове метода снаружи класса - т.е. так
>
> CLASS class : hello ." HELLO" CR ; ;CLASS
> class NewObj VALUE obj
> obj :: class.hello
>
> компилируется вызов не напрямую CALL, а через SEND.
> Понятно что надо переключать SELF, но вызов при этом идёт косвенный -
> через CALL регистр. Можно ли в принципе немножко соптимизировать т.к.
> на этапе компиляции вся информация про обьект доступна?
>  
1. Если мы на 100% уверены что в hello не будет вызываться self или
данные то можно просто сделать CALL, но здесь легко сделать ошибку.
2. Можно (SEND) переписать на ассемблере, наверняка это прилично
поднимет скорость
3. Можно (SEND) заинлайнить и оптимизатор отрежет часть инструкций по краям
4. Самая лучшая оптимизация - все трудоемкие операции упаковывать в
слова внутрь класса

В принципе даже через (SEND) можно заменить снижение быстродействия
только например считая математику и вызывая например умножение векторов
так, тогда процентов 5 снижения будет заметно.

Дело в том что в основном методы вызываются внутри класса то есть
простые форт слова, а снаружи класс дает интерфейс управления, то есть
какие-либо потери в (SEND) незначительны имхо и в крайнем случае я бы
сделал пункт 2.
> Можно было бы сдвинуть внутреннюю структуру обьекта так чтобы сами
> данные начинались по смещению ноль, а дополнительная ячейка в -CELL
> Удобнее будет брать размер обьекта или давать адрес на его
> внутренности, когда это зеркало какой-нибудь структуры API например CRect.
>  
Да, мысль хорошая, думаю стоит реализовать. Записал в todo list.

Дмитрий.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: hype3

Ruvim Pinka
On 11/3/07, Dmitry Yakimov <[hidden email]> wrote:
> ygrek wrote:
> > Понятно что надо переключать SELF, но вызов при этом идёт косвенный -
> > через CALL регистр. Можно ли в принципе немножко соптимизировать т.к.
> > на этапе компиляции вся информация про обьект доступна?
[...]
> 3. Можно (SEND) заинлайнить и оптимизатор отрежет часть инструкций по краям

Оно определено как
  : (SEND) ( a xt) SELF >R SWAP TO SELF EXECUTE  R> TO SELF ;

Значит,строчку
  LIT, POSTPONE (SEND)
записать как (условно):
  <postpone> SELF >R TO SELF </postpone>
  COMPILE,
  <postpone> R> TO SELF </postpone>

Игрек, ты это имеел ввиду?

--
Ruvim
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: hype3

ygrek-3
On Sun, 4 Nov 2007 18:51:30 +0300
"Ruvim Pinka" <[hidden email]> wrote:

> Значит,строчку
>   LIT, POSTPONE (SEND)
> записать как (условно):
>   <postpone> SELF >R TO SELF </postpone>
>   COMPILE,
>   <postpone> R> TO SELF </postpone>

ага.
Помню что делал одномерные динамические массивы(очередные) на hype3, и
по результатам заметил большое падение скорости, хотя рассчитывал на
один в один к не-ОО решению, т.к. никакой виртуализации не было.
Вообщем подозреваю именно это место :)

--

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev

attachment0 (196 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: hype3

Dmitry Yakimov-2
ygrek wrote:

> On Sun, 4 Nov 2007 18:51:30 +0300
> "Ruvim Pinka" <[hidden email]> wrote:
>
>  
>> Значит,строчку
>>   LIT, POSTPONE (SEND)
>> записать как (условно):
>>   <postpone> SELF >R TO SELF </postpone>
>>   COMPILE,
>>   <postpone> R> TO SELF </postpone>
>>    
>
> ага.
> Помню что делал одномерные динамические массивы(очередные) на hype3, и
> по результатам заметил большое падение скорости, хотя рассчитывал на
> один в один к не-ОО решению, т.к. никакой виртуализации не было.
> Вообщем подозреваю именно это место :)
>
>  
Должен сказать что когда WFL обновился до версии 2, hype тоже обновился,
и это место было оптимизировано.
Так что сейчас все может быть быстрее.

А что за код тестировался? Странно что именно большое падение скорости.
Дмитрий.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: hype3

azekeprofit
Administrator
In reply to this post by Ruvim Pinka
Ruvim Pinka wrote
On 11/3/07, Dmitry Yakimov <ftech@tula.net> wrote:
> ygrek wrote:
> > Понятно что надо переключать SELF, но вызов при этом идёт косвенный -
> > через CALL регистр. Можно ли в принципе немножко соптимизировать т.к.
> > на этапе компиляции вся информация про обьект доступна?
[...]
> 3. Можно (SEND) заинлайнить и оптимизатор отрежет часть инструкций по краям

Оно определено как
  : (SEND) ( a xt) SELF >R SWAP TO SELF EXECUTE  R> TO SELF ;

Значит,строчку
  LIT, POSTPONE (SEND)
записать как (условно):
  <postpone> SELF >R TO SELF </postpone>
  COMPILE,
  <postpone> R> TO SELF </postpone>
Таким макросом можно заменить две последовательности LIT, POSTPONE (SEND) в ~day/hype3/hype3.f :

: (SEND), ( xt -- )
POSTPONE SELF POSTPONE >R                  \ <postpone> SELF >R </postpone>
['] SELF CFL + CELL+ COMPILE,              \ <postpone> TO SELF </postpone>
COMPILE,                                   \ <postpone> LITERAL EXECUTE </postpone>
POSTPONE R> ['] SELF CFL + CELL+ COMPILE,  \ <postpone> R> TO SELF </postpone>
;

Схожим образом строчки:

LIT, LIT,    
['] (send-obj) COMPILE,

заменяются на:

SWAP LIT, POSTPONE SELF POSTPONE + POSTPONE @
(SEND),

Плюс есть ещё в ~day/hype3/locals.f -- там чуть-чуть сложнее из-за того что LIT, находится в одном слове ( CompileMethod ) а POSTPONE (SEND) -- в другом ( CompileCall ).

Сделал эти три вещи -- работают.

Оптимизатор там уже рисует нормально, но, доводкой думаю можно довести статические вызовы до 4-7-и машинных инструкций (4-е -- это оптимистический случай вроде данного ygrek'ом примера, когда кроме известного на этапе компиляции xt метода известен заранее ещё и объект).