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

Вниз

Доступ к property на встроенном asm   Найти похожие ветки 

 
Jedi ©   (2003-07-14 14:28) [0]

Есть свойство, к котрому нужно обратиться из assembler-процедуры. свойство типа
property Width: integer read FWidth write SetWidth;
Помогите, плиз, как это реализовать?


 
Skier ©   (2003-07-14 14:30) [1]

Зачем сие ?


 
Anatoly Podgoretsky ©   (2003-07-14 14:30) [2]

Свойство это не что то реальное, а инстуркция компилятору как работать, толи организовать доступ до поля, толи вызвать фунцию, в твоем примере жто прямой доступ до поля FWidth при чтении и вызов функции SetWidth при записи.


 
Jedi ©   (2003-07-14 14:31) [3]

Оптимизация по скорости выполнения.


 
Anatoly Podgoretsky ©   (2003-07-14 14:32) [4]

Если хочешь посмотреть как это делается, то напиши следующий код

w := x.width;
x.width := 5;

и посмотри в окне CPU


 
Jedi ©   (2003-07-14 14:33) [5]

Если я пишу
call TClass.SetWidth
то компилятор ругается "Неизвестный идентификатор"


 
Skier ©   (2003-07-14 14:33) [6]

>Jedi © (14.07.03 14:31)
Её не будет !


 
Anatoly Podgoretsky ©   (2003-07-14 14:33) [7]

Jedi © (14.07.03 14:31)
Ты уверен, что у тебя это будет быстрее, чем у Дельфи, знаком ли ты с оптимизацией под конкретные процессоры?


 
Jedi ©   (2003-07-14 14:37) [8]

Под конкретный проц не нужно, достаточно убрать лишние обращения к памяти,
типа For J:=20 downto 0 do
Width:=20
Компилер переводит как двойное обращение к памяти. И обращения к сопроцессору у Дельфи не очень


 
Skier ©   (2003-07-14 14:38) [9]

>Jedi © (14.07.03 14:37)

> типа For J:=20 downto 0 do
> Width:=20

Откуда это следует ?

> И обращения к сопроцессору у Дельфи не очень

Смелый ты ! :)


 
Jedi ©   (2003-07-14 14:39) [10]

Сорри, описался...
Под конкретный проц не нужно, достаточно убрать лишние обращения к памяти,
типа For J:=20 downto 0 do
Width:=J
Компилер переводит как двойное обращение к памяти. И обращения к сопроцессору у Дельфи не очень



 
Digitman ©   (2003-07-14 14:43) [11]


> Jedi © (14.07.03 14:39)



> типа For J:=20 downto 0 do
> Width:=J
> Компилер переводит как двойное обращение к памяти



аргументируй это asm-листингом


> обращения к сопроцессору у Дельфи не очень


опять же - аргументируй !


 
Jedi ©   (2003-07-14 14:43) [12]

mov [ebp+$04], eax
mov edx, [sbp+$04]
...
call SetWidth

Можно написать

mov edx, eax
...
call SetWidth

На счет сопроцессора.
Каждое выражение компилер обрабатівает как отдельное,
соответственно, загружает в стек и выгружает много раз, а при циклических вычислениях постоянные можно держать в стеке


 
Skier ©   (2003-07-14 14:49) [13]

>Jedi © (14.07.03 14:43)

> Каждое выражение компилер обрабатівает как отдельное,
> соответственно, загружает в стек и выгружает много раз,
>

А знаком ли ты с такими понятиями как :
- ПОЛИЗ
- Исключение общих подвыражений
- Понижение стоимости инструкций ?




 
Jedi ©   (2003-07-14 14:56) [14]

листинг обращений сопроцессору..
Строка
A:=Round(I*SinAngle-J*CosAngle)
Угол постоянен (для данного метода). Соответственно и косинус с синусом постоянны
Компилер:
fild [ebp+$04]
fmul [ebp+$0E]
fild [ebp+$08]
fmul [ebp+$12]
faddp st(0), st(1)
fstp [какой-то адрес]
call @ROUND

Я пишу:
fld sinangle
fld cosangle
.....
а в цикле уже
fild I
fild J
fmul St(0), st(1)
fxch st(2)
fmul st(1), st(0)
fxch st(2)
faddp
fistp A
То же самое, но работает быстрее (проверял)




 
Digitman ©   (2003-07-14 14:56) [15]


> Jedi © (14.07.03 14:43)


ты выдрал из контекста три строчки и лишь на этом основании утверждаешь, что код неоптимален ?)

ну-ну)


а на TClass.SetWidth "ругается"
потому что SetWidth, вероятно, имеет область видимости иную нежели требуется в данном случае


 
Jedi ©   (2003-07-14 14:57) [16]

>Skier
Нет.


 
Jedi ©   (2003-07-14 14:59) [17]

>Digitman
Да, SetWidth - private-метод. Но компилер-то его вызывает! При написании pascal-кодом.


 
Skier ©   (2003-07-14 15:03) [18]

>Jedi © (14.07.03 14:57)
Тогда скажу следующее :
Я думаю (да нет я просто уверен :) ), что программисты
в Borland-e имеют представление об этом и по сему ты вряд ли напишешь (для твоего случая) более оптимальный код, чем
это делает Delphi.
Вывод : не занимайся ерундой, а сконцентрируйся на решении
своей конкретной задачи.

Кстати, вполне вероятно, что ты совсем не там ищешь место для
оптимизации своего кода.


 
Digitman ©   (2003-07-14 15:03) [19]


> Но компилер-то его вызывает!


если обращение к TClass.SetWidth ты производишь в том же модуле, где декларирован TClass, то компилятор правильно отработает его хоть в asm хоть в pas


 
Dmk ©   (2003-07-14 15:07) [20]

http://delphimaster.net/view/1-1058178449/


 
Dmk ©   (2003-07-14 15:14) [21]

Dmk © (14.07.03 15:07)
Стерли уже =)
При входе в процедуру класса EAX содержит
указатель на этот класс.
Поэтому можно сделать так.

asm
mov eax, eax.FWidth
call SetWidth
end;

Только зачем?


 
Anatoly Podgoretsky ©   (2003-07-14 15:23) [22]

Оптимизировать нужно там где действительно реальные потери производительности, а не там где кажется, а основной резерв в алгоритме и в очень больших циклах, как правило у программиста обработка больших циклов получается хуже чем у компилятора (проверено практикой), они любят использовать "оптимальные" команды.


 
Anatoly Podgoretsky ©   (2003-07-14 15:25) [23]

Jedi © (14.07.03 14:33)
К вопросу о Jedi © (14.07.03 14:33)
Что позволено Юпитеру, то не позволено быку. Значит ты пытаешься обратиться не по праву к приватному методу.


 
VMcL ©   (2003-07-14 18:22) [24]

>Jedi © (14.07.03 14:43)

Как насчет опции {$Optimization ON}


 
Jedi ©   (2003-07-14 19:58) [25]

Необходимо вызвать private-метод другого класса


 
Anatoly Podgoretsky ©   (2003-07-14 20:46) [26]

Ну тебе же сказали, что ты не Юпитер, это можно если в одном модуле.


 
Fantasist.   (2003-07-15 02:10) [27]

Если проперти published, посмотри TypInfo - SetOrdProp. Может выцепишь что полезное.



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

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

Наверх




Память: 0.53 MB
Время: 0.016 c
3-91637
s_ser
2003-06-24 12:25
2003.07.28
Работать с BLOB полями в INTERBASE, через IBX компоненты.


3-91648
McSimm2
2003-07-03 16:30
2003.07.28
[Oracle] вернуть


14-91873
paxer
2003-07-11 17:09
2003.07.28
Помогите с идиотским вопросом.


7-91935
3S
2003-05-17 20:12
2003.07.28
Как отключить служебные клавиши (win, alt+tab и др) в WinNT/2K/XP


8-91775
swamp
2003-04-03 13:50
2003.07.28
Много спрайтов