Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> If then, Есть несколько вареанов который лучше 
:(
    Опции темы
ivan219
Дата 13.5.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Код

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 
PM MAIL ICQ   Вверх
Guedda
Дата 13.5.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Сделай два варианта через GetTickCount... И посмотри, что быстрее... 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Zlo
Дата 13.5.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



Еще мона дизасемблировать и посмотреть какой код длиннее smile 
PM MAIL   Вверх
ivan219
Дата 13.5.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



 smile  
PM MAIL ICQ   Вверх
Zlo
Дата 13.5.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



Да это долго блин....

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

Это сообщение отредактировал(а) Zlo - 13.5.2006, 22:45
PM MAIL   Вверх
ivan219
Дата 14.5.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



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

А как ей пользоватся smile  
PM MAIL ICQ   Вверх
Guedda
Дата 14.5.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Вот так:
Код

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;
 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ivan219
Дата 14.5.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



 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;
 
PM MAIL ICQ   Вверх
Демо
Дата 14.5.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
Тутанхамец
Дата 14.5.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 1
Всего: 6



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

Код

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, 11:40
PM MAIL   Вверх
Демо
Дата 14.5.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вот функции для измерения маленьких промежутков времени:

Код

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. 


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 14.5.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 15.5.2006, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



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

Это сообщение отредактировал(а) Mechanic - 15.5.2006, 01:38
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
drkot
Дата 15.5.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



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


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1061 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.