Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какой вызов процедуры быстрее?


Barloggg ©   (2005-09-20 11:33:00) 

Какой вызов процедуры быстрее?
Есть вот такой класс
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 или запуск пустышки?


evvcom   (2005-09-20 13:40:00) [1]


> Barloggg

А чем тебя проверка не устраивает? Тормозит сильно? Ну выгадаешь ты десяток машинных тактов и что дальше? Сокращение на десяток тактов из тысячи ты даже не заметишь. Так есть ли смысл так извращаться?


kblc   (2005-09-20 13:03:00) [2]

Джо ©   (20.09.05 12:59) [11]
/me матерится..
Прошу прощения - я не прав..


Джо   (2005-09-20 12:59:00) [3]


>  [10] kblc ©   (20.09.05 12:57)
> > Джо ©   (20.09.05 12:54) [9]
> я про тот самый OR в Ас-ме

И где он там? Там будет test, в крайнем случае cmp.


kblc   (2005-09-20 12:57:00) [4]

> Джо ©   (20.09.05 12:54) [9]

я про тот самый OR в Ас-ме


Джо   (2005-09-20 12:54:00) [5]


>  [8] kblc ©   (20.09.05 12:45)

Где там OR?


kblc   (2005-09-20 12:45:00) [6]

Проверяешь ты на nilне сам класс а ссылку. так что только один ORчем как ты говоришь ещё и унаследования предков...


Digitman   (2005-09-20 12:38:00) [7]


> Barloggg


не понятно, зачем тут регулярные процедуры, когда сплошь и рядом - классы/объекты и их методы...


Джо   (2005-09-20 12:37:00) [8]

А какой смысл объекта, если в этом единственном (?) методе нет обращения к его полям? А если есть обращение к полям, то если "объект не создан", то такое вообще невыполнимо.
Или я чего-то не понимаю?


Barloggg   (2005-09-20 12:34:00) [9]

Если больше одного объекта, тогда добавится Sender и вызов будет таким:
P(a);
Ну и соответственно описание типа процедуры изменится.
хмм...
я вот не уверен, что лишняя проверка быстрее будет... эти классы имеют под собой множество невидимых проверок... побочный эффект принципа наследования...


Плохиш   (2005-09-20 12:28:00) [10]


> Barloggg   (20.09.05 12:12) [2]

А если создано больше одного объекта?


kblc   (2005-09-20 12:17:00) [11]

Я вообще не понимаю смысла данной конструкции...
Проверка на nil ( OR ) помоему быстрее чем вызов "пустышки" JMP - RET


Barloggg   (2005-09-20 12:12:00) [12]

Согласен, тогда класс меняем, делаем так:

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...

Итак, такая организция это крутизна или кривизна?


Digitman   (2005-09-20 11:39:00) [13]


> при создании объекта сделаем так
> a:=tc.create;p:=tc.p;


нет, не "сделаем".

компилятор за это тут же по мозгам даст.


Наверх

Титульная страница Поиск, карта сайта Написать письмо