Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > If then


Автор: ivan219 13.5.2006, 21:05
Код

If A=1 then
 If B=2 then
  If C=3 then
   If D=4 then E:=5;



Код

If (A=1) and (B=2) and (C=3) and (D=4) then E:=5;


Оба кода делают одно и тоже но кто быстрее присвоит E:=5 или E так и останится в первоначальном состоянии  smile 

Автор: Guedda 13.5.2006, 21:23
Сделай два варианта через GetTickCount... И посмотри, что быстрее... 

Автор: Zlo 13.5.2006, 22:20
Еще мона дизасемблировать и посмотреть какой код длиннее smile 

Автор: ivan219 13.5.2006, 22:25
 smile  

Автор: Zlo 13.5.2006, 22:42
Да это долго блин....

Добавлено @ 22:44 
поидеи можно сравнение заменить сложением + одно сравнение это должно занять куда меньше тактов проца!
например так:
E:=A+B+C+D;
if E=10 then....  

Автор: ivan219 14.5.2006, 09:31
Цитата(Guedda @ 13.5.2006,  21:23)
Сделай два варианта через GetTickCount... И посмотри, что быстрее...

А как ей пользоватся smile  

Автор: Guedda 14.5.2006, 09:38
Вот так:
Код

procedure TForm1.Button1Click(Sender : TObject);
var
  Old,New : Integer;
begin
  Old := GetTickCount;
  If A=1 then
 If B=2 then
  If C=3 then
   If D=4 then E:=5;
  New := GetTickCount;
  Label1.Caption := IntToStr(New-Old);
end;

porecudure TForm1.Button2Click(Sender : TObject);
var
  Old, New : Integer;
begin
  Old := GetTickCount;
  If (A=1) and (B=2) and (C=3) and (D=4) then E:=5;
  New := GetTickCount;
  Label2.Caption := IntToStr(New-Old);
end;
 

Автор: ivan219 14.5.2006, 11:19
 smile  В обоих вареантах пишет 0 это что означает smile
Даже когда все переменные =0 и если они не равны 0 т.е. удвлитворяют условиям smile 
Код

procedure TForm1.Button1Click(Sender : TObject);    
var    
  Old,New : Integer;    
begin
 A:=1;
 B:=2;
 C:=3;
 D:=4;
  Old := GetTickCount;
  If A=1 then
 If B=2 then    
  If C=3 then    
   If D=4 then E:=5;    
  New := GetTickCount;    
  Label1.Caption := IntToStr(New-Old);    
end;

procedure TForm1.Button2Click(Sender : TObject);
var
  Old, New : Integer;    
begin
 A:=1;
 B:=2;
 C:=3;
 D:=4;
  Old := GetTickCount;    
  If (A=1) and (B=2) and (C=3) and (D=4) then E:=5;    
  New := GetTickCount;    
  Label2.Caption := IntToStr(New-Old);    
end;
 

Автор: Демо 14.5.2006, 11:27
Цитата(ivan219 @  14.5.2006,  11:19 Найти цитируемый пост)
 В обоих вареантах пишет 0 это что означает 


А потому что нужно замеры в цикле делать. Например 1000000 циклов для каждого варианта.
 

Автор: Тутанхамец 14.5.2006, 11:39
Функция возвращает число миллисекунд. Значит, как я понимаю, всё дело занимает меньше миллисекунды. Чтоб занимало больше миллисекунды можно выполнять оба кода в цикле. 

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
    A:integer=1;
    b:integer=2;
    c:integer=3;
    d:integer=4;
    n=100000000;
var
  Form1: TForm1;
  e:integer;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender : TObject);
var
  Old,New : cardinal;
  I:integer;
begin
  Old := GetTickCount;
for i:=1 to n do If A=1 then
 If B=2 then
  If C=3 then
   If D=4 then E:=5;
  New := GetTickCount;
  Label1.Caption := IntToStr(New-Old);
  label3.caption:=inttostr(old);
  label4.caption:=inttostr(new);
end;

procedure TForm1.Button2Click(Sender : TObject);
var
  Old, New : cardinal;
  i:integer;
begin
  Old := GetTickCount;

for i:=1 to n do  If (A=1) and (B=2) and (C=3) and (D=4) then E:=5;
  New := GetTickCount;
  Label2.Caption := IntToStr(New-Old);
label3.caption:=inttostr(old);
label4.caption:=inttostr(new);

end;

end.


Если пощелкать по кнопкам несколько раз, видно, что операция занимает разное количество временив заивисмости, наверное, от состояния системы. 

У меня лично разница между двумя кодами была неощутимой. Обе кнопки выдавали результат в пределах примерно 609-678. То одна была быстрее, то другая. 

А я почему-то думал, что первый вариант должен быть быстрее... 

P.S. Demo, твой кольт был быстрее... smile  

Автор: Демо 14.5.2006, 12:39
Вот функции для измерения маленьких промежутков времени:

Код

function TickCount:Int64;
begin
  QueryPerformanceCounter(Result);
end;

function DeltaTickToSeconds(const Delta: Int64):Double;
var
  TickFreq: Int64;
begin
  QueryPerformanceFrequency(TickFreq);
  Result := Delta/TickFreq;
end;


Применение:

Код

var
  n1: Int64;
begin
  n1 := TickCount;
//Здесь код
  Memo1.Lines.Add(FloatToStr(DeltaTickToSeconds(TickCount-n1)));


Добавлено @ 12:40 
Кроме того, для точных измерений времени, заираченного на выполнение, нужно воспользоваться функцией GetThreadTimes. 

Автор: Yanis 14.5.2006, 23:47
Цитата(ivan219 @  13.5.2006,  22:05 Найти цитируемый пост)
Оба кода делают одно и тоже но кто быстрее присвоит E:=5 или E так и останится в первоначальном состоянии
Ты подумал, что написал?

Цитата(ivan219 @  13.5.2006,  22:05 Найти цитируемый пост)
кто быстрее присвоит E:=5
IMHO:В данном случае разница ничтожно мала, что нисколько не влияет на скорость исполнения кода. 

Автор: Mechanic 15.5.2006, 01:35
Второй вариант практически равносилен первому при {$B-}  smile  
Однако, при "Complete boolean eval" ({$B+}), второй будет медленнее. 

Автор: drkot 15.5.2006, 15:34
Еще и оптимизацию кода стоит отключить, а то и при дизасемблировании разницы не будет 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)