Текущий архив: 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.52 MB
Время: 0.005 c