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

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

const в параметрах [D7]


Страницы:   1 2 3 4 5

махс ©   (2008-03-02 11:23:00) 

Загадка для меня. В каких случаях в процедуру или функцию передают значение константой;

Я понимаю, что это означает. Но вот когда именно это применяют не пойму. Бывает выжу чужой исходник, в функцию передают пять параметров - не один внутри функции не изменяют, а с констнтой идет только самый первый.

Поясните?

Спасибо.


oxffff   (2008-03-02 21:39:00) [41]


> Loginov Dmitry ©   (02.03.08 21:37) [44]
> > 5562 и 484. Догадайся где быстрее.
>
>
> Быстрее второй цикл. И что из этого? Const-то тут причем?
>


Как причем? Это благодаря const. Ты что не в курсе?


Loginov Dmitry   (2008-03-02 21:38:00) [42]

> Прикол в том, что тебе нужно перечитать Help.


Да без проблем! Где тебе непонятно? Давай почитаю!
:)


oxffff   (2008-03-02 21:37:00) [43]


> Anatoly Podgoretsky ©   (02.03.08 21:30) [39]
> > oxffff  (02.03.2008 21:27:37)  [37]
>
> Зачем, меня эти тесты не интересуют


А как быть с Anatoly Podgoretsky ©   (02.03.08 14:28) [7]?

Ведь нет разницы, что

procedure abc(i: integer);
begin
..
end;

procedure abcEx(const i: integer);
begin
..
end;


Loginov Dmitry   (2008-03-02 21:37:00) [44]

> 5562 и 484. Догадайся где быстрее.


Быстрее второй цикл. И что из этого? Const-то тут причем?


oxffff   (2008-03-02 21:34:00) [45]


> Loginov Dmitry ©   (02.03.08 21:31) [40]
> > А ты оптимизатор отключи. И тогда тебе станет все понятно.
>
>
>
> А ты сам сперва попробуй!


5562 и 484. Догадайся где быстрее.


oxffff   (2008-03-02 21:32:00) [46]


> Прикол в том, что компилятор "забил" на директиву const
> и передал I по значению :)


Прикол в том, что тебе нужно перечитать Help. :)
Внимательно изучить [20] и [21] c учетом [36]
(либо вынудить оптимизатор не пропускать код).


Anatoly Podgoretsky   (2008-03-02 21:31:00) [47]

> Loginov Dmitry  (02.03.2008 21:27:38)  [38]

С чего ты ставишь знак равенства между ссылка и const - тебе Борланд это обещал?


Loginov Dmitry   (2008-03-02 21:31:00) [48]

> А ты оптимизатор отключи. И тогда тебе станет все понятно.


А ты сам сперва попробуй!


Anatoly Podgoretsky   (2008-03-02 21:30:00) [49]

> oxffff  (02.03.2008 21:27:37)  [37]

Зачем, меня эти тесты не интересуют


Loginov Dmitry   (2008-03-02 21:27:00) [50]

> Получается одинаково.... Странно все это :)


Прикол в том, что компилятор "забил" на директиву constи передал I по значению :)


oxffff   (2008-03-02 21:27:00) [51]


> Anatoly Podgoretsky ©   (02.03.08 21:10) [33]


Отключите оптимизатор, чтобы компилятор не искал зависимости.


oxffff   (2008-03-02 21:25:00) [52]


> Loginov Dmitry ©   (02.03.08 21:09) [32]
> > Опять заблуждение, хочешь пример?
>
>
> Вообще-то ранее решь шла именно о Default, как параметре
> целого типа. Никакие TypeA не фигурировали.
>
> Да и в [20] пример некорректный. showmessage там ни о чем
> не говорит.


А ты оптимизатор отключи. И тогда тебе станет все понятно.


{RASkov}   (2008-03-02 21:18:00) [53]

> Зачем измерять обращение к пустой функции, основные затраты
> как раз внутри.

Вот другое дело, я что-то сразу и не сообразил

procedure abc(i: integer);
begin
 Form1.Tag:=I*Random(I);
end;

procedure abcEx(const i: integer);
begin
 Form1.Tag:=I*Random(I);
end;

--begin test1--
abc -   703, abcEx -   687
abc -   687, abcEx -   703
abc -   688, abcEx -   703
abc -   703, abcEx -   687
abc -   687, abcEx -   688
--end test1 begin test2--
abc -   734, abcEx -   688
abc -   735, abcEx -   687
abc -   735, abcEx -   687
abc -   734, abcEx -   703
abc -   734, abcEx -   703
--end test2--

Получается одинаково.... Странно все это :)


Loginov Dmitry   (2008-03-02 21:13:00) [54]

> Зачем измерять обращение к пустой функции, основные затраты
> как раз внутри.


Кстати да, на ассемблере оба участка кода абсолютно одинаковые :)


Anatoly Podgoretsky   (2008-03-02 21:10:00) [55]

> oxffff  (02.03.2008 20:49:29)  [29]

Зачем измерять обращение к пустой функции, основные затраты как раз внутри.


Loginov Dmitry   (2008-03-02 21:09:00) [56]

> Опять заблуждение, хочешь пример?


Вообще-то ранее решь шла именно о Default, как параметре целого типа. Никакие TypeA не фигурировали.

Да и в [20] пример некорректный. showmessage там ни о чем не говорит.


{RASkov}   (2008-03-02 21:07:00) [57]

Вот целиком модуль
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure abc(i: integer);
begin
//ii cia?aie?
end;

procedure abcEx(const i: integer);
begin
//ii nnueee
end;

procedure Test1;
var i:Integer;
 Tick1,Tick2:DWORD;
begin
 Tick1:=GetTickCount;
 for i:=0 to 100000000 do abc(555);
 Tick1:=GetTickCount-Tick1;

 Tick2:=GetTickCount;
 for i:=0 to 100000000 do abcEx(555);
 Tick2:=GetTickCount-Tick2;

 Form1.Memo1.Lines.Add(Format('abc - %3d, abcEx %3d', [Tick1, Tick2]));
end;

procedure Test2;
var i:Integer;
 Tick1,Tick2:DWORD;
begin
 Tick1:=GetTickCount;
 for i:=0 to 100000000 do abcEx(555);
 Tick1:=GetTickCount-Tick1;

 Tick2:=GetTickCount;
 for i:=0 to 100000000 do abc(555);
 Tick2:=GetTickCount-Tick2;

 Form1.Memo1.Lines.Add(Format('abc - %3d, abcEx %3d', [Tick1, Tick2]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var N: Integer;
begin
 Form1.Memo1.Lines.Add('--begin test1--');
 for N:=0 to 4 do begin Test1; sleep(100); end;
 Form1.Memo1.Lines.Add('--end test1 begin test2--');
 for N:=0 to 4 do begin Test2; sleep(100); end;
 Form1.Memo1.Lines.Add('--end test2--');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
Tick1,Tick2:DWORD;
begin
 Tick1:=GetTickCount;
 for i:=0 to 100000000 do abc(555);
 Tick1:=GetTickCount-Tick1;

 Tick2:=GetTickCount;
 for i:=0 to 100000000 do abcEx(555);
 Tick2:=GetTickCount-Tick2;

 showmessage(inttostr(Tick1)+' - '+inttostr(Tick2));
end;

end.

Вообщем нового, как я ни старался, из этой ветки я не узнал :( А так все началось интересно.. :)


{RASkov}   (2008-03-02 21:03:00) [58]

---------------------------
Project1
---------------------------
(abcEx)266 - (abc)906
---------------------------
OK  
---------------------------

---------------------------
Project1
---------------------------
(abc)860 - (abcEx)312
---------------------------
OK  
---------------------------
?? :) Я уже по всякому перепробывал и все равно с конст быстрее....

вот еще результаты:
--begin test1--
abc - 907, abcEx 312
abc - 906, abcEx 313
abc - 907, abcEx 312
abc - 922, abcEx 297
abc - 922, abcEx 297
--end test1 begin test2--
abc - 250, abcEx 875
abc - 266, abcEx 859
abc - 250, abcEx 875
abc - 266, abcEx 859
abc - 250, abcEx 875
--end test2--


oxffff   (2008-03-02 20:49:00) [59]


> RASkov} ©   (02.03.08 20:46) [28]


Попробуй именно в одной процедуре.
Один раз запустил зафиксировал.
Поменял, запустил, зафиксировал.


{RASkov}   (2008-03-02 20:46:00) [60]

> [27] oxffff ©   (02.03.08 20:38)

Ну фик знает)

procedure abc(i: integer);
begin
//ii cia?aie?
end;

procedure abcEx(const i: integer);
begin
//ii nnueee
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
 Tick1,Tick2:DWORD;
begin
Tick1:=GetTickCount;
for i:=0 to 100000000 do abc(555);
Tick1:=GetTickCount-Tick1;

Tick2:=GetTickCount;
for i:=0 to 100000000 do abcEx(555);
Tick2:=GetTickCount-Tick2;

showmessage(inttostr(Tick1)+' - '+inttostr(Tick2));
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
 Tick1,Tick2:DWORD;
begin
Tick1:=GetTickCount;
for i:=0 to 100000000 do abcEx(555);
Tick1:=GetTickCount-Tick1;

Tick2:=GetTickCount;
for i:=0 to 100000000 do abc(555);
Tick2:=GetTickCount-Tick2;

showmessage(inttostr(Tick1)+' - '+inttostr(Tick2));
end;

---------------------------
Button1Click
922 - 297
---------------------------
Button2Click
485 - 906
---------------------------


Страницы:   1 2 3 4 5

Наверх

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