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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 19:52   #1
ZoRT
Пользователь
 
Регистрация: 20.01.2012
Сообщений: 16
По умолчанию Вложенный if или сложные условия

Интересует вопрос, что быстрее сработает, вложенный if или сложное условие?
Например
Код:
a:=5;
b:=10;
c:=20;
if(a>b and b<c) then ...

или 

if(a>b) then
  if(b<c) then
    ...
В сложных условиях(коньюнкция простых выражений) если одно выражение false, тогда условие проверяется дальше?

ps: интересует как паскаль, так и си подобные языки.
ps ps: заранее спасибо
ZoRT вне форума Ответить с цитированием
Старый 18.04.2012, 20:13   #2
IQDDD
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 17
По умолчанию

Компилятор оптимизирует выражения в скобках так, что если первый операнд в конъюнкции равен false, второй не вычисляется (Первым обычно считает левый. Другими словами, операции логического умножения левоассоциативна.). Так же как и если в дизъюнкции первый операнд оказывается равным true. Вложенный if никак не может работать быстрее. Возможно, он при определённых условиях будет работать с такой же скоростью, как условие.

ps: напишите функции returnTrue и returnFalse, которые всегда возвращают true и false соответственно. Поставьте точки останова в каждой функции. Теперь засуньте в какое-нибудь условие (returnFalse and returnTrue). Останов сработает только на returnFalse.

Последний раз редактировалось IQDDD; 18.04.2012 в 20:16.
IQDDD вне форума Ответить с цитированием
Старый 18.04.2012, 20:48   #3
ZoRT
Пользователь
 
Регистрация: 20.01.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от IQDDD Посмотреть сообщение
Компилятор оптимизирует выражения в скобках так, что если первый операнд в конъюнкции равен false, второй не вычисляется (Первым обычно считает левый. Другими словами, операции логического умножения левоассоциативна.). Так же как и если в дизъюнкции первый операнд оказывается равным true. Вложенный if никак не может работать быстрее. Возможно, он при определённых условиях будет работать с такой же скоростью, как условие.

ps: напишите функции returnTrue и returnFalse, которые всегда возвращают true и false соответственно. Поставьте точки останова в каждой функции. Теперь засуньте в какое-нибудь условие (returnFalse and returnTrue). Останов сработает только на returnFalse.
интересно, а препод говорит обратное(сложное выражение вычисляется полностью и сл-но нужно использовать вложенные if'ы. Прогу откатил. .
ZoRT вне форума Ответить с цитированием
Старый 18.04.2012, 21:15   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

IQDDD, "ленивые" вычисления характерны для си (и, наверное, си-подобных языков). Паскаль и Дельфи не такие
Если в си можно написать if (a!=0)&&(b%a!=0), и не какой ошибки не возникнет, то в Дельфи консольное приложение просто закрывается (даже ошибки не выдает).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.04.2012, 21:47   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

ZoRT, можно опыты провести. При включенной и выключенной оптимизации, как в Delphi, так и в Pascal код получился совершенно идентичный.
eoln вне форума Ответить с цитированием
Старый 18.04.2012, 21:53   #6
ZoRT
Пользователь
 
Регистрация: 20.01.2012
Сообщений: 16
По умолчанию

ну я пока не очень понимаю как можно опыт провести
ну вроде все понятно, всем спасибо
ZoRT вне форума Ответить с цитированием
Старый 18.04.2012, 21:57   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Просто откомпилировать оба варианта и сравнить в отладчике. А ещё проще сравнить не в отладчике, а просто по содержимому файлов (если содержимое будет одинаково, то значит разницы нет)
eoln вне форума Ответить с цитированием
Старый 18.04.2012, 23:44   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
ну я пока не очень понимаю как можно опыт провести
загнать в цикл тыщ эдтак на 60 повторений и замерять время в одном и другом случае... сразу станет видно, какой из вариантов работает быстрее)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 18.04.2012, 23:51   #9
ZoRT
Пользователь
 
Регистрация: 20.01.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
загнать в цикл тыщ эдтак на 60 повторений и замерять время в одном и другом случае... сразу станет видно, какой из вариантов работает быстрее)
да я пробовал так только на 60тыс это маловато было, но не суть...
там не очень точно выходит, иногда в 0.5-1с у одной меньше, иногда у другой, бывает на 0.1мс различается...в общем без разницы видимо, можно делать как удобнее)))
ZoRT вне форума Ответить с цитированием
Старый 19.04.2012, 13:33   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Современные процессоры имеют суперскалярную архитектуру. Отсюда следует важный вывод: среднее время выполнения операции условного перехода в несколько десытков раз больше, чем время выполнения арифметических или логических операций. Поэтому, если при роверке условия не вызывается сложная процедура, обрабатывающая массив, то время вычисления логического выражения будет меньше, чем среднее время условного перехода.

2. В п.1. я не случайно употребил термин "среднее время условного перехода". Из-за того, что условный проверка условия блокирует работу конвейера, в современных процессорах применяется блок предсказания ветвлений. Если этот блок выдал верное предсказание, условный переход занимает время сравнимое с временем выполнения арифметических и логических команд, а если нет - происходит сброс конвейера, т.е. откат программы назад на несколько десятков шагов. Поэтому "среднее время условного перехода" сильно зависит от работы блока предсказания и характера обрабатываемых данных. Поэтому просто измерив время выполнения 60 тыс. проходов цикла с условным переходом не даст реальной картины - необходимо еще позаботиться, чтобы распределение переходов по тому или иному условию совпадало с таковым в реальной задаче. Иначе мы получим сильно заниженное время выполнения условного перехода и, что, вероятнее всего, приведет нас к неверным выводам.
Чтобы грамотно поставить эксперимент по измерению времени тех или иных команд, нужно иметь представление об архитектуре процессора, и учитывать все ее особенности.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенный запрос GinIvan Помощь студентам 0 27.03.2012 13:01
Оператор условия или как сделать чтобы анализировало все переменные eriskay Помощь студентам 9 07.01.2011 00:19
Сложные математические вычисления или логичность coNsept Свободное общение 11 30.08.2010 03:14
Сложные SQL запросы или хранимые процедуры! Killer_djon БД в Delphi 17 25.03.2008 12:10