Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 14:27   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию Условный вопрос

Как-то возникла ситуация:
Условие то-то тогда сообщим об ошибке
действие


А не лучше ли
Условие то-то тогда сообщим об ошибке иначе действие

Просто если условие истинно сообщаем об ошибке и покидаем функцию, действие же должно выполняться в случае если проверка дала false. В принципе одно и тоже но как обстоят дела в отношении быстродействия?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.09.2009, 14:31   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Мдаа... Вопросы гуру не всегда понятны простым смертным.
Я слышал о разнице в скорости между While, Repeat и For, но для полноценного\неполноценного if - нигде.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 10.09.2009, 14:39   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Подобные операции выполняются в цикле, обработка строк. Здесь каждый тик имеет значение .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.09.2009, 14:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Utkin
Во-первых: Оптимизатор бдит - о бдя его страшна
Во-вторых: ты описал совершенно разные стратегии, тут все зависит от того когда нужно действие выполнить, а вжруг оно всегда должно выполняться, тогда первый код неверен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2009, 14:52   #5
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Ну, что можно сказать по этому поводу....
Код:
var
  Form1: TForm1;
  Bol: Boolean = True;
  st: integer=0;

implementation

{$R *.dfm}

procedure lotofIfelse;
var
  Ku: Pansichar;
begin
  if Bol=True then
  begin
    inc(st);
  end
  else
  begin
    GetMem(Ku, 1024);
    FreeMem(Ku, 1024);
    GetMem(Ku, 1024);
    FreeMem(Ku, 1024);
    GetMem(Ku, 1024);
    FreeMem(Ku, 1024);
  end;
end;

procedure lotofIfexit;
var
  Ku: Pansichar;
begin
  if Bol=True then
  begin
    inc(st);
    exit;
  end;

  GetMem(Ku, 1024);
  FreeMem(Ku, 1024);
  GetMem(Ku, 1024);
  FreeMem(Ku, 1024);
  GetMem(Ku, 1024);
  FreeMem(Ku, 1024);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  SD: TDatetime;
  s: string;
begin
  SD:=NOW();

  for i:=0 to high(integer) do
    lotofIfelse;

  s:=formatdatetime('hh:nn:ss.zz',now()-SD);

  SD:=NOW();

  for i:=0 to high(integer) do
    lotofIfexit;

  s:=s+#13+formatdatetime('hh:nn:ss.zz',now()-SD);

  ShowMessage(S);
end;
Результат ниже.
Изображения
Тип файла: jpg Result.JPG (4.8 Кб, 113 просмотров)
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось SuperVisor; 10.09.2009 в 15:03. Причина: Сердечно извиняюсь.. Скунды забыл... )))
SuperVisor вне форума Ответить с цитированием
Старый 10.09.2009, 14:58   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Действие должно выполняться только в том случае, если нет ошибки. Это условие проверяет входящие параметры, а действие вызов процедуры по работе со структурой. То есть к примеру проверка выхода индекса за границы, проверка корректности имени и пр. в том же духе. Иными словами выполнение действия напрямую связано с результатами проверки.

Я так и подозревал, в общем иначе будет быстрей чем просто действие после условия. Не зря задал такой вопрос. Только, такой результат всегда? В смысле не вызвана ли задержка операциями ОС?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 10.09.2009 в 15:01.
Utkin вне форума Ответить с цитированием
Старый 10.09.2009, 15:05   #7
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Результат постоянный.
Сейчас попробую действия со строками и памятью - видно будет. Комп в покое оставлю. )) Здесь результат выложу.

Нет, все-таки exit отрабатывет быстрее..
Если после условия идет очень громоздкая и объемная конструкция, то else проигрывает. Но, опять же, это лишь доли секунды...
Ниже приведены 2 результата.

Однако закралось такое подозрение, что компилятор улавливает махинации с условием, поэтому я немного его подкорректировал - начал менять переменные в операторе for:
Код:
for i:=0 to 100000000 do
  begin
    Bol:=((i mod 100)=0);
    Bol2:=((i mod 33)=0);
    Bol3:=((i mod 2)=0);
И задал в процедурах условие:
Код:
if Bol or Bol2 or bol3 or not (Bol and Bol2 and bol3) then
Следующие 2 изображения - результат работы этого цикла.

Делаем выводы.. )))
Кому интересно, что делалось и не делалось - исходник приложил.
Изображения
Тип файла: jpg Result.JPG (4.8 Кб, 109 просмотров)
Тип файла: jpg Копия Result.JPG (4.8 Кб, 80 просмотров)
Тип файла: jpg Копия Копия Result.JPG (4.8 Кб, 105 просмотров)
Тип файла: jpg Копия Копия Копия Result.JPG (4.8 Кб, 100 просмотров)
Вложения
Тип файла: txt Unit1.txt (5.5 Кб, 145 просмотров)
Познавая других, мы познаем себя.
С'est la vie...

Последний раз редактировалось Stilet; 10.09.2009 в 16:55.
SuperVisor вне форума Ответить с цитированием
Старый 10.09.2009, 16:10   #8
Luke
Пользователь
 
Аватар для Luke
 
Регистрация: 12.10.2007
Сообщений: 32
По умолчанию

Скажем так, то что на практике это проверили это хорошо... Но все, расскажу как все происходит...

Условие надо составлять так, чтобы _предполагаемо_ оно было как можно чаще true.

Код:
    call ds:SomeProc
    cmp eax, SomeExpression
    jne NE
    call SomeProcIfExpressionIsTrue
    jmp NextCode
    NE:
    call SomeProcIfExpressionFalse
    NextCode:
В это варинанте в обоих вариантах выполняются два перехода и два вызова. Чтож, а если вместо вызова SomeProcIfExpressionFalse() у нас будет просто код? Притом много? Тогда вместо jne придеться использовать jmp. Точнее придеться прыгать (jne) на метку, где будет стоять jmp IfFalse. Вот и выгода. + безусловный переход короче на байт=)
Si vis pacem, para bellum!
Luke вне форума Ответить с цитированием
Старый 10.09.2009, 16:36   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Есть же директивы {$ +I} и {$ -I} - отключение проверки на ошибку системными методами.
Директива возвращает code < ошибки> или ноль ( нет ошибки).
Вот с ними и следует работать -
Код:
if Result = 0 then < продолжаeм программу>
  else  < действия в случае возникновения ошибки>;
  { можно case ... of (коды ошибок)}
Цитата:
try... finally
- для ошибок не определяемых системой.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 10.09.2009 в 17:41.
DeKot вне форума Ответить с цитированием
Старый 10.09.2009, 16:45   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
действие же должно выполняться в случае если проверка дала false
try... finally, не?
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
условный оператор в PHP Xeon332 PHP 6 15.06.2009 17:29
Delphi 7. Условный оператор Юрий2009 Помощь студентам 9 29.04.2009 19:36
Delphi 7. Условный оператор Юрий2009 Помощь студентам 2 27.04.2009 20:10
Delphi 7. Условный оператор Юрий2009 Помощь студентам 1 27.04.2009 19:16
Условный оператор IF в Си Zid@ne Помощь студентам 7 24.12.2008 20:02