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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2014, 14:46   #1
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию Условие IF, вопрос

Всем Привет!

По условиям задачи нужно использовать несколько IF, так вот, какой код исполнится быстрее?

код 1
Код:
   x := 3; k1 := 5; k2 := 7;
   if x < k1 then
     if x < k2 then
       ...
код 2
Код:
   if (x < k1) and (x < k2) then
     ...
условия в задаче гораздо сложнее, но есть возможность использовать один if...

Подскажите, какой код "быстрее"
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 14.05.2014, 14:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

обычно это примерно одно и тоже.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.05.2014, 14:57   #3
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
обычно это примерно одно и тоже.
ОК, а если условий будет не 2, а два десятка? "быстрее" будет с одним IF или если будет 20 условий отдельно?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 14.05.2014, 15:08   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

посмотрите в дебагере во что превратиться оно в окне чпу, тогда поймете что и как
eval вне форума Ответить с цитированием
Старый 14.05.2014, 15:17   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Быстрей будет так:
Код:
 if x < k1 then
А к2 выкиньте на помойку ибо он тут в условии нафиг не сдался.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.05.2014, 15:22   #6
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Быстрей будет так:
Код:
 if x < k1 then
А к2 выкиньте на помойку ибо он тут в условии нафиг не сдался.
Код привел как пример... интересует именно оптимизация по времени, все в один IF или по отдельности...
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 14.05.2014, 15:24   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

всегда надо смотреть конкретный случай, так как есть еще оптимизаторы и т.д.
в любом случае асемблер скажет как оно есть
eval вне форума Ответить с цитированием
Старый 14.05.2014, 15:39   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

читайте про опцию компилятора:
Цитата:
Код:
Complete boolean eval 	
Evaluates every piece of an expression in Boolean terms, regardless of whether the result of an operand evaluates as false. 
Corresponds to {$B}.
если в опциях стоит ПОЛНОЕ вычисление логического выражения, то вариант со вложенными IF будет быстрее...
это раз.

но, если только Вы в выражениях не вызываете функции, которые обрабатывают массивы данных, то это попытка экономии на спичках.
напишите в цикле (ну, миллион раз) вызов куска кода со вложенными IF и куска кода с логическим выражением со множеством проверок. Уверен, что даже в случае Complete boolean eval = TRUE, разница на миллион циклов будет доли секунды (если вообще будет!! ...
Это означает, что в реальном проекте подобная оптимизация никакого реального выигрыша не даст!


всё сказанное выше - моё IMHO, то бишь субъективное личное мнение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2014, 15:54   #9
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
читайте про опцию компилятора:

если в опциях стоит ПОЛНОЕ вычисление логического выражения, то вариант со вложенными IF будет быстрее...
это раз.

но, если только Вы в выражениях не вызываете функции, которые обрабатывают массивы данных, то это попытка экономии на спичках.
напишите в цикле (ну, миллион раз) вызов куска кода со вложенными IF и куска кода с логическим выражением со множеством проверок. Уверен, что даже в случае Complete boolean eval = TRUE, разница на миллион циклов будет доли секунды (если вообще будет!! ...
Это означает, что в реальном проекте подобная оптимизация никакого реального выигрыша не даст!


всё сказанное выше - моё IMHO, то бишь субъективное личное мнение...
Этого достаточно, всем спасибо, тему можно закрыть
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 14.05.2014, 16:43   #10
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Тоже заинтересовал вопрос. Результаты.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, i: integer;
  t1, t2: int64;
begin
  a0 := 20;
  a1 := 1;
  a2 := 2;
  a3 := 3;
  a4 := 4;
  a5 := 5;
  a6 := 6;
  a7 := 7;
  a8 := 8;
  a9 := 9;
  a10 := 10;
  t1 := GetTickCount;
  for I := 0 to 1000000000 do
    if a0 > a1 then
      if a0 > a2 then
        if a0 > a3 then
          if a0 > a4 then
            if a0 > a5 then
              if a0 > a6 then
                if a0 > a7 then
                  if a0 > a8 then
                    if a0 > a9 then
                      if a0 > a10 then
                        a0 := 20;
  t2 := GetTickCount;
  Memo1.Lines.Add('Комбинация if - then отработала за ' + IntToStr(t2 - t1) + ' мс');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, i: integer;
  t1, t2: int64;
begin
  a0 := 20;
  a1 := 1;
  a2 := 2;
  a3 := 3;
  a4 := 4;
  a5 := 5;
  a6 := 6;
  a7 := 7;
  a8 := 8;
  a9 := 9;
  a10 := 10;
  t1 := GetTickCount;
  for I := 0 to 1000000000 do
    if (a0 > a1) and
      (a0 > a2) and
        (a0 > a3) and
          (a0 > a4) and
            (a0 > a5) and
              (a0 > a6) and
                (a0 > a7) and
                  (a0 > a8) and
                    (a0 > a9) and
                      (a0 > a10) then
                        a0 := 20;
  t2 := GetTickCount;
  Memo1.Lines.Add('Комбинация if - and отработала за ' + IntToStr(t2 - t1) + ' мс');
end;
Код:
Комбинация if - then отработала за 4469 мс
Комбинация if - and отработала за 4062 мс
Чтоб увидеть хоть какую -то разницу, пришлось зарядить МИЛЛИАРД! циклов. С небольшим отрывом победил and.
doktor255 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
условие С++ svkpro Помощь студентам 2 28.11.2012 00:54
условие If Артем1999 C++ Builder 2 10.07.2012 15:01
Условие if revaldo666 Общие вопросы C/C++ 1 20.01.2012 01:50
условие Maka111 Microsoft Office Excel 5 17.05.2009 18:25