Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 20.09.2005, 11:38   [включить плавающее окно]   #1
Barloggg
Мужской Продвинутый
Автор темы
 
Аватар для Barloggg
 
Регистрация: 11.03.2003
Адрес: Тьмутаракань2, лен. обл
Какой вызов процедуры быстрее?

Какой вызов процедуры быстрее?
Есть вот такой класс
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 или вызов пустышки?
Barloggg вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 20.09.2005, 13:33   [включить плавающее окно]   #2
Ant.ttk
Мужской Продвинутый
 
Аватар для Ant.ttk
 
Регистрация: 16.11.2004
Адрес: Троицк
я тебе предлагаю провести практический опыт и сделать необходимые замеры. потом нам скажешь, тоже интересно!
__________________
Feel the force, motherf*ckers.
Ant.ttk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 20.09.2005, 14:03   [включить плавающее окно]   #3
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
первый лучше потому что не медленнее второго и понятен нормальному программисту
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 20.09.2005, 14:30   [включить плавающее окно]   #4
groger
Мужской Интересующийся
 
Регистрация: 05.07.2005
Адрес: Троицк
Если я правильно понимаю, то вызывать просто процедуру быстрее, чем метод класса.
Код:
 mov eax,[a]
 call tc.p
Сравнение с nil занимает 8 байтов.
Код:
 cmp dword ptr [a],$00
 jz +$0a //зависит от длины кода под  if
С другой стороны, вызывая процедуру, нельзя будет использовать Self, т.к. mov eax,[a] никто не сделал. А так как методы класса обычно оперируют с самим классом, то большого смысла в этом вызове не будет.
__________________
Вчера с пальмы слез
groger вне форума  
Ответить с цитированием
Непрочитано 20.09.2005, 23:12   [включить плавающее окно]   #5
Ant.ttk
Мужской Продвинутый
 
Аватар для Ant.ttk
 
Регистрация: 16.11.2004
Адрес: Троицк
{ variant 1 }

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4250 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4375 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4391 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4375 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4390 miliseconds

{ variant 2 }

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
3718 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4078 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4093 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4079 miliseconds

F:\...m Files\Borland\Delphi7\Projects>sp_test.exe
4093 miliseconds

{ params }

Cyrcles:DWORD = 1 000 000 000;
__________________
Feel the force, motherf*ckers.
Ant.ttk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 06.10.2005, 21:57   [включить плавающее окно]   #6
Phodopus
Мужской Продвинутый
 
Регистрация: 05.10.2005
Адрес: Санкт-Петербург
сравнение с nil (в Дельфи есть спец. оператор (или макрос?) Assigned()) быстрее, чем вызов процедуры, причем любой. потому как сравнение - 2 команды процессора, вызов процедуры-(1-вызов, 1-возврат - тоже 2) но! вызов процедуры связан с накладными расходами на сохранение текущего адреса и на ветвление. плюс тупой (иногда у него бывает) компилятор может встроить в пустышку стандартный кадр входа/выхода из процедуры... так что if <>nil или if Assigned()..
P.S. предыдущее не совсем корректно, т.к. во время цикла процессор занимается не только вашей программой, но еще и 1000 раз переключится на другие задачи, что съедает время цикла с потрохами.
Есть функции QueryPerfomanceCounter и QueryPerfomance_что_то_еще (по первой найти можно) которая измеряет время в тактах, но тут тоже свои камни. во-первых она процессорно-зависимая и может быть некорректна, во вторых доля времени приходится на завершение самой этой фукции и (при втором вызове) - на начало этой функции. Время выполнения самой функции можно посчитать сделав два вызова подряд, ну а время выполнения оператора (не миллиона, а одного, чтобы была минимальная вероятность переключения на другую задачу) - вставив код между ними (ясен пень )

Phodopus добавил :

P.P.S. кстати сравнение - в баснословно худшем случае - 8 байт.
если переменная находится по известному адресу - 7 (непоср. операнд)
если есть любой нулевой регистр - 6
если переменная попадает в кадр стека или идексируется - 3
если находится в регистре - 2..
так что всему король - компилятор. ИМХО - первый вариат 100%. Так делают все, и никто не задумывался..

Но вот назрел другой вопрос - неужели тебе все-равно, сделает что-нибудь процедура (вызовется) или вообще ничего не произойдет (пустышка)?
Phodopus вне форума  
Ответить с цитированием
Непрочитано 07.10.2005, 15:19   [включить плавающее окно]   #7
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
на самом деле тут главный камень в очистке конвеера при условном переходе
если переход предсказан правильно, то наличие условия практически ни на чем не отразится
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 07:12. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey