Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизКакой вызов процедуры быстрее? Найти похожие ветки
← →
Barloggg (2005-09-20 11:33) [0]Какой вызов процедуры быстрее?
Есть вот такой класс
type TC=Class
procedure p;
end;
есть куча объектов такого класса которые могут быть, а могут и не быть (игра-стратегушка)
и надо часто вызывать его процедуру.
вот таким образом
var a:tc;
....
if a<>nil then tc.p;
...
Не лучше ли сделать так?
type Tp=procedure;
procedure p0;begin end;это процедура-пустышка
var a:tc;
var p:Tp;
.....
вначале один раз объявим
p:=p0;
....
а при создании объекта сделаем так
a:=tc.create;p:=tc.p;
и потом будем часто вызывать процедуру вот таким образом
p;
без каких-либо проверок. если объект есть, вызовется его процедура, а если нету, то вызовется пустышка.
стоит ли?
Что быстрее: лишняя проверка на nil или запуск пустышки?
← →
Digitman © (2005-09-20 11:39) [1]
> при создании объекта сделаем так
> a:=tc.create;p:=tc.p;
нет, не "сделаем".
компилятор за это тут же по мозгам даст.
← →
Barloggg (2005-09-20 12:12) [2]Согласен, тогда класс меняем, делаем так:
type Tp=procedure;
type Tc=class
p:Tp;
end;
var
a:Tc;
p:Tp;
Procedure p0;
Procedure p1;
implementation
Procedure p0;begin
showmessage("NotOK");
end;
procedure p1;begin
showMessage("OK");
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
p:=p0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
p;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
a:=tc.Create;
a.p:=p1;
p:=a.p;
end;
Вот. Пока объект не создан, вызывается пустышка, а если создан, то вызывается ссылка из объекта.
Но смысл остался тем же.
Только в процедуру придется еще толкать ссылку на сам объект, но пустышке наплевать, что туда придет nil...
Итак, такая организция это крутизна или кривизна?
← →
kblc © (2005-09-20 12:17) [3]Я вообще не понимаю смысла данной конструкции...
Проверка на nil ( OR ) помоему быстрее чем вызов "пустышки" JMP - RET
← →
Плохиш © (2005-09-20 12:28) [4]
> Barloggg (20.09.05 12:12) [2]
А если создано больше одного объекта?
← →
Barloggg (2005-09-20 12:34) [5]Если больше одного объекта, тогда добавится Sender и вызов будет таким:
P(a);
Ну и соответственно описание типа процедуры изменится.
хмм...
я вот не уверен, что лишняя проверка быстрее будет... эти классы имеют под собой множество невидимых проверок... побочный эффект принципа наследования...
← →
Джо © (2005-09-20 12:37) [6]А какой смысл объекта, если в этом единственном (?) методе нет обращения к его полям? А если есть обращение к полям, то если "объект не создан", то такое вообще невыполнимо.
Или я чего-то не понимаю?
← →
Digitman © (2005-09-20 12:38) [7]
> Barloggg
не понятно, зачем тут регулярные процедуры, когда сплошь и рядом - классы/объекты и их методы ...
← →
kblc © (2005-09-20 12:45) [8]Проверяешь ты на nil не сам класс а ссылку. так что только один OR чем как ты говоришь ещё и унаследования предков...
← →
Джо © (2005-09-20 12:54) [9]
> [8] kblc © (20.09.05 12:45)
Где там OR?
← →
kblc © (2005-09-20 12:57) [10]> Джо © (20.09.05 12:54) [9]
я про тот самый OR в Ас-ме
← →
Джо © (2005-09-20 12:59) [11]
> [10] kblc © (20.09.05 12:57)
> > Джо © (20.09.05 12:54) [9]
> я про тот самый OR в Ас-ме
И где он там? Там будет test, в крайнем случае cmp.
← →
kblc © (2005-09-20 13:03) [12]Джо © (20.09.05 12:59) [11]
/me матерится..
Прошу прощения - я не прав..
← →
evvcom © (2005-09-20 13:40) [13]
> Barloggg
А чем тебя проверка не устраивает? Тормозит сильно? Ну выгадаешь ты десяток машинных тактов и что дальше? Сокращение на десяток тактов из тысячи ты даже не заметишь. Так есть ли смысл так извращаться?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c