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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2011, 08:33   #1
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию Оператор ветвления в различных языках программирования

Интересует следующее. Есть какой-то код:

...

if [уловие]
{
код1
}
else
{
код2
}
...


Вопрос: если условие не верно, (то есть будет выполнен "код2"), то будет ли компьютер тратить время на чтение "код'а1" или он просто будет игнорировать его? Аналогично, если условие верно, важно ли для компьютера, выполняющего программу, что находится в блоке "код2"? Зависит ли это от самого ЯП, от того компилируемый/интерпретируемый ли ЯП или нет?
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 14.09.2011, 08:45   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Linel Посмотреть сообщение
если условие не верно, (то есть будет выполнен "код2"), то будет ли компьютер тратить время на чтение "код'а1" или он просто будет игнорировать его?
Определи понятие "читать код" для компьютера.
Для инструкций есть только одно: быть загруженной в конвеер и выполненной. Иначе говоря, это выполнение. Так вот: выполнения не будет. Но тут есть одно "но"..

В современных процессорах есть т.н. предсказание ветвления. То есть, проц может начать выполнять ту ветку, которую считает более вероятной. Но это никак не влияет на результат выполнения программы. Если предсказание было верным - выполнение продолжается, если нет - конвеер очищается.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 14.09.2011, 08:51   #3
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

Цитата:
Для инструкций есть только одно: быть загруженной в конвеер и выполненной. Иначе говоря, это выполнение. Так вот: выполнения не будет.
Цитата:
Но это никак не влияет на результат выполнения программы. Если предсказание было верным - выполнение продолжается, если нет - конвеер очищается.
Спасибо большое. Это, собственно то, что я и хотел узнать.
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 14.09.2011, 09:13   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Добавлю для пущей убедительности.. ))
Такие ветвления часто делают, чтоб обойти ситуацию типа деления на нуль. Возможно, что реально комп выберет именно ветку с делением на нуль и ВЫПОЛНИТ ЕГО. Но исключения (ошибки) НЕ ВОЗНИКНЕТ, если потом выяснится, что ветка неверная.
Ты все это можешь подтвердить экспериментом, что называется )).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 14.09.2011, 09:23   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Если критично быстродействие - старайся составлять алгоритмы так, чтобы условия в большинстве случаев выполнялись с истинной ветвью.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.09.2011, 12:19   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Linel Посмотреть сообщение
Вопрос: если условие не верно, (то есть будет выполнен "код2"), то будет ли компьютер тратить время на чтение "код'а1" или он просто будет игнорировать его? Аналогично, если условие верно, важно ли для компьютера, выполняющего программу, что находится в блоке "код2"?
лучше пояснить на примере

Код:
if (0)
{
//тонна сложного кода
} else
{
//нужный код
}
или
Код:
if (1)
{
//нужный код
}
скорость выполнения обоих кусков кода будет одинакова, с точностью до единого такта. Ну да, конечно постоянно ложные или постоянно истинные условия могут быть оптимизированы на уровне компиляции, но в данном контексте под 0 и 1 я подразумеваю условия которые всегда ложны или всегда истинны и которые не могут быть оптимизированы на уровне компиляции.

Цитата:
Сообщение от TinMan Посмотреть сообщение
В современных процессорах есть т.н. предсказание ветвления. То есть, проц может начать выполнять ту ветку, которую считает более вероятной. .
возможно такое есть на платформах отличных от x86-64, конкретно на x86-64 такого точно нет (хотя возможно я что-то пропустил...), но есть очень важное понятие как спаривание команд, впрочем при программирование на ЯВУ эта фишка теряет своё значение.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Если критично быстродействие - старайся составлять алгоритмы так, чтобы условия в большинстве случаев выполнялись с истинной ветвью.
это фишка даёт выигрыш максимум в 3-4 такта, и как следствие имеет значение только в миллионых или миллардных циклах.

Последний раз редактировалось rpy3uH; 14.09.2011 в 12:23.
rpy3uH вне форума Ответить с цитированием
Старый 14.09.2011, 12:34   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
возможно такое есть на платформах отличных от x86-64, конкретно на x86-64 такого точно нет (хотя возможно я что-то пропустил...)
Может в самих х86-64 и не заложено предсказаний, но у современных процессоров, совместимых с данными архитектурами, блок предсказания ветвлений имеется.
pu4koff вне форума Ответить с цитированием
Старый 14.09.2011, 13:12   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Может в самих х86-64 и не заложено предсказаний, но у современных процессоров, совместимых с данными архитектурами, блок предсказания ветвлений имеется.
Я согласен с rpy3uHом, я несколько переборщил.. Предсказание ветвлений ограничивается загрузкой соответствующих инструкций. Про их выполнение - похоже, я размечтался.. ))

rpy3uH, спасибо за поправку, +1
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 14.09.2011, 14:03   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Я согласен с rpy3uHом, я несколько переборщил.. Предсказание ветвлений ограничивается загрузкой соответствующих инструкций. Про их выполнение - похоже, я размечтался.. ))
Ссылку на источник можно?
Какой смысл в этом предсказателе, если он практически ничего не делает?
Спорить не буду, т.к. особо не вникал в этот вопрос, но в ВУЗе нам говорили, что предсказатель этот как раз загружает инструкции и данные, а так же по возможности выполняет эти самые инструкции, чтобы конвейер не простаивал, что и является целью, ради которой этот самый предсказатель вообще придумали.
pu4koff вне форума Ответить с цитированием
Старый 14.09.2011, 14:23   #10
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Спорить не буду, т.к. особо не вникал в этот вопрос, но в ВУЗе нам говорили, что предсказатель этот как раз загружает инструкции и данные, а так же по возможности выполняет эти самые инструкции, чтобы конвейер не простаивал, что и является целью, ради которой этот самый предсказатель вообще придумали.
основная проблема при обучениии в ВУЗе состоит в том что приходится помнить что надо говорить преподу при сдаче экзамена (или зачёта) и как всё обстоит на самом деле. (проще говоря надо знать версию препода и настоящую версию)
rpy3uH вне форума Ответить с цитированием
Ответ


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

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

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