![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
const в параметрах [D7]
махс © (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
---------------------------