Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1125407174
Гость22
2005-08-30 17:06
2005.10.09
Много полей в таблице???


14-1126844828
Rentgen
2005-09-16 08:27
2005.10.09
COM1 -> Ethernet -> COMn


2-1125308192
Zikmu
2005-08-29 13:36
2005.10.09
Запуск приложений


2-1125325409
SergP.
2005-08-29 18:23
2005.10.09
Проблема с SQL запросом.


4-1123941644
TheGUEST
2005-08-13 18:00
2005.10.09
Создание патча





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский