![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 20.01.2012
Сообщений: 16
|
![]()
Интересует вопрос, что быстрее сработает, вложенный if или сложное условие?
Например Код:
ps: интересует как паскаль, так и си подобные языки. ps ps: заранее спасибо |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 12.09.2008
Сообщений: 17
|
![]()
Компилятор оптимизирует выражения в скобках так, что если первый операнд в конъюнкции равен false, второй не вычисляется (Первым обычно считает левый. Другими словами, операции логического умножения левоассоциативна.). Так же как и если в дизъюнкции первый операнд оказывается равным true. Вложенный if никак не может работать быстрее. Возможно, он при определённых условиях будет работать с такой же скоростью, как условие.
ps: напишите функции returnTrue и returnFalse, которые всегда возвращают true и false соответственно. Поставьте точки останова в каждой функции. Теперь засуньте в какое-нибудь условие (returnFalse and returnTrue). Останов сработает только на returnFalse. Последний раз редактировалось IQDDD; 18.04.2012 в 20:16. |
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 20.01.2012
Сообщений: 16
|
![]() Цитата:
![]() |
|
![]() |
![]() |
![]() |
#4 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,429
|
![]()
IQDDD, "ленивые" вычисления характерны для си (и, наверное, си-подобных языков). Паскаль и Дельфи не такие
![]() Если в си можно написать if (a!=0)&&(b%a!=0), и не какой ошибки не возникнет, то в Дельфи консольное приложение просто закрывается (даже ошибки не выдает).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
![]()
ZoRT, можно опыты провести. При включенной и выключенной оптимизации, как в Delphi, так и в Pascal код получился совершенно идентичный.
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 20.01.2012
Сообщений: 16
|
![]()
ну я пока не очень понимаю как можно опыт провести
![]() ну вроде все понятно, всем спасибо ![]() |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
![]()
Просто откомпилировать оба варианта и сравнить в отладчике. А ещё проще сравнить не в отладчике, а просто по содержимому файлов (если содержимое будет одинаково, то значит разницы нет)
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]() Цитата:
Правильно поставленная задача - три четверти решения.
|
|
![]() |
![]() |
![]() |
#9 | |
Пользователь
Регистрация: 20.01.2012
Сообщений: 16
|
![]() Цитата:
![]() там не очень точно выходит, иногда в 0.5-1с у одной меньше, иногда у другой, бывает на 0.1мс различается...в общем без разницы видимо, можно делать как удобнее))) |
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
1. Современные процессоры имеют суперскалярную архитектуру. Отсюда следует важный вывод: среднее время выполнения операции условного перехода в несколько десытков раз больше, чем время выполнения арифметических или логических операций. Поэтому, если при роверке условия не вызывается сложная процедура, обрабатывающая массив, то время вычисления логического выражения будет меньше, чем среднее время условного перехода.
2. В п.1. я не случайно употребил термин "среднее время условного перехода". Из-за того, что условный проверка условия блокирует работу конвейера, в современных процессорах применяется блок предсказания ветвлений. Если этот блок выдал верное предсказание, условный переход занимает время сравнимое с временем выполнения арифметических и логических команд, а если нет - происходит сброс конвейера, т.е. откат программы назад на несколько десятков шагов. Поэтому "среднее время условного перехода" сильно зависит от работы блока предсказания и характера обрабатываемых данных. Поэтому просто измерив время выполнения 60 тыс. проходов цикла с условным переходом не даст реальной картины - необходимо еще позаботиться, чтобы распределение переходов по тому или иному условию совпадало с таковым в реальной задаче. Иначе мы получим сильно заниженное время выполнения условного перехода и, что, вероятнее всего, приведет нас к неверным выводам. Чтобы грамотно поставить эксперимент по измерению времени тех или иных команд, нужно иметь представление об архитектуре процессора, и учитывать все ее особенности. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вложенный запрос | 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 |