OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 25 Июнь, 2018 20:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 27 Январь, 2010 19:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Не уверен, что тема в правильном форуме...
Просто способ, который сейчас часто применяю. Сильно связано с RETURN в Оберон-7.
Код:
... операторы, определяющие значение a
a := ...
IF a THEN
  ... операторы, определяющие значение b
  b := ...
  IF b THEN
    ... операторы, определяющие значение c
    c := ...
    IF c THEN
      ...
    ELSE
      ...
    END
  ELSE
    ...
  END
ELSE
  ...
END

Код:
... операторы, определяющие значение a
ok := a;
IF ~ok THEN
  ...
END;
IF ok THEN
  ... операторы, определяющие значение b
  ok := b;
  IF ~ok THEN
    ...
  END
END;
IF ok THEN
  ... операторы, определяющие значение c
  ok := c;
  IF ~ok THEN
    ...
  END
END

Ощущения (проверенные практикой) --- читабельность повышается. Работать с кодом много легче (порезан на независимые последовательно идущие куски).

Если кого волнует скорость (лишние проверки).
1) Да хоть и в ущерб скрости, пока не заметно. Главное читабельнее.
2) Не факт что в ущерб. См. след. два сообщения


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2010 19:11 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7830
Откуда: Троицк, Москва
Всегда так поступаю в подобных случаях.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2010 19:13 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Part II: IA-64 Optimization Guide писал(а):
11.2.2 Predication in IA-64
Now that the performance implications of branching have been described, this section overviews predication – the primary IA-64 mechanism used by optimizations described in this section.

Almost all IA-64 instructions can be tagged with a guarding predicate. If the value of the guarding predicate is false at execution time, then the predicated instruction’s architectural updates are suppressed, and the instruction behaves like a nop. If the predicate is true, then the instruction behaves as if it were unpredicated. There are a small number of instructions such as unconditional compares and floating-point square-root and reciprocal approximate instructions whose qualifying predicate do not operate as described above. See Part I: IA-64 Application Architecture Guide for additional information.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Январь, 2010 19:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
IA-64 Application Instruction Set Architecture Guide Revision 1.0 писал(а):
2.8 Predication
Predication is the conditional execution of instructions. Conditional execution is implemented through branches in traditional architectures. IA-64 implements this function through the use of predicated instructions. Predication removes branches used for conditional execution resulting in larger basic blocks and the elimination of associated mispredict penalties.

To illustrate, an unpredicated instruction
Код:
        r1 = r2 + r3
when predicated, would be of the form
Код:
        if (p5) r1 = r2 + r3

In this example p5 is the controlling predicate that decides whether or not the instruction executes and updates state. If the predicate value is true, then the instruction updates state. Otherwise it generally behaves like a nop. Predicates are assigned values by compare instructions.

Predicated execution avoids branches, and simplifies compiler optimizations by converting a control dependence to a data dependence. Consider the original code:
Код:
        if (a>b) c = c + 1
        else d = d * e + f
The branch at (a>b) can be avoided by converting the code above to the predicated code:
Код:
        pT, pF = compare(a>b)
        if (pT) c = c + 1
        if (pF) d = d * e + f
The predicate pT is set to 1 if the condition evaluates to true, and to 0 if the condition evaluates to false. The predicate pF is the complement of pT. The control dependence of the instructions c = c + 1 and d = d * e + f on the branch with the condition (a>b) is now converted into a data dependence on compare(a>b) through predicates pT and pF (the branch is eliminated). An added benefit is that the compiler can schedule the instructions under pT and pF to execute in parallel. It is also worth noting that there are several different types of compare instructions that write predicates in different manners including unconditional compares and parallel compares.



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2010 14:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
А я с вами не согласен.

Вспомогательный флаг = программист не справился с управлением.

В подобных случаях стараюсь свести к канонической форме линейного поиска (даже ценой введения процедур):
Код:
IF C0(...) THEN
  A0(...)
ELSIF C1(...) THEN
  A1(...)
ELSIF C2(...) THEN
  A2(...)
ELSE
  ...
END
Любой ветвистый if-овый код может (и должен :D ) быть сведён к этой канонической форме.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2010 14:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
А причём тут IA-64? Кто-нибудь Итаниумы живьём видел?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2010 15:34 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Евгений Темиргалеев писал(а):
Если кого волнует скорость (лишние проверки).
1) ...
2) Не факт что в ущерб. См. след. два сообщения

Если не ошибаюсь, код с ok близок к указанному виду оптимизации для ia-64.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2010 15:50 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 525
Откуда: Москва
В заголовке темы ошибка, не "1 ур.вл-ти", а 2.
Вместо 3, но с введением дополнительной сущности.
Изврат это.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Январь, 2010 16:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Peter Almazov писал(а):
В заголовке темы ошибка, не "1 ур.вл-ти", а 2.
согласен
Peter Almazov писал(а):
Вместо 3,
дана схема-пример 3 ур. работающая для произв.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Январь, 2010 05:20 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
По мне так нормально и естественно смотрится, если не больше трёх вложений:
Код:
// Если файловый пак удачно загружен
      IF FileLangPack <> NIL THEN BEGIN
         // Ищем там указанный модуль
         IF FindLangUnit(FileLangPack, Client.Name, LangUnit) THEN BEGIN
            // Ищем там строки указанного языка
            IF FindLangStrings(LangUnit, LangName, LangStrings) THEN BEGIN
               // Очищаем старый язык клиента
               FreeOldClientLang(Client);
               // Записываем данные о новом
               SetClientLang(Client, LangName, LangStrings, C_FILEPACK);
               // Следующий клиент...
               CONTINUE;
            END; // .if
         END; // .if
      END; // .if


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Январь, 2010 21:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Стараюсь придерживаться везде одного стиля...

Ваш пример, мне кажется, не совсем подходит. Ветки ELSE отсутствуют. И (по всей видимости код не опущен) вложенные посл-ти операторов начинаются сразу с IF. На КП я бы записал:
Код:
IF (FileLangPack # NIL)
  & FindLangUnit(FileLangPack, Client.Name, LangUnit)
  & FindLangStrings(LangUnit, LangName, LangStrings) THEN
  ...
END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Январь, 2010 22:36 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
А если потом появится дополнительный код, который нужно вызвать после очередного IF, и это не простая логическая функция? Вам придётся разбивать условие на блоки. Если я не ошибаюсь, по той же причине из Оберона убрали паскалевский IF ... THEN ...; и заменили на блочный IF THEN ELSE END.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Январь, 2010 23:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Стараюсь придерживаться везде одного стиля (см. первый пост). Там один блок на два разбить не проблема. Выше -- как я бы переписал Ваш код один в один.

Berserker писал(а):
Если я не ошибаюсь, по той же причине из Оберона убрали паскалевский IF ... THEN ...; и заменили на блочный IF THEN ELSE END.
Составной оператор (операторные скобки) BEGIN ... END "заменён" на StatementSequence = Statement {; Statement}.
Как следствие изменились IF и остальные structured statemens:
IF expr THEN statement [ELSE statement] заменилось на IF expr THEN StatementSequence [ELSE StatementSequence] END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 22:55 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4485
Откуда: Россия, Орёл
Сергей Губанов писал(а):
А я с вами не согласен.
...
Любой ветвистый if-овый код может (и должен :D ) быть сведён к этой канонической форме.
Попробовал переписать пару кусков с ok указанным способом. Появились лишние процедуры, но "независимые куски" стали явно видны в ветках IF.

Запись с ok я бы назвал в этом случае (ненужной) оптимизацией. Спасибо за наводку.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB