Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Вниз

Доступ к 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.009 c
4-91959
sosv
2003-05-23 10:53
2003.07.28
WH_MOUSE Где я ошибся?


11-91700
Miek
2002-11-04 21:15
2003.07.28
глобальный затык в KOL-проекте


14-91894
Катрин
2003-07-11 19:32
2003.07.28
Память в Delphi


11-91699
Bartov
2002-11-22 14:51
2003.07.28
ImageList


3-91630
Till
2003-07-04 08:30
2003.07.28
Тонкий клиент для Oracle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский