Кобол, если заявления - PullRequest
       10

Кобол, если заявления

1 голос
/ 27 декабря 2011

Какая логика будет лучше или эффективнее:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF

или

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF

Ответы [ 5 ]

3 голосов
/ 27 декабря 2011

Я бы предпочел следующее:

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF

В общем, трудно читать действия на if false, поэтому я предпочитаю говорить положительно.И я не думаю, что разница в эффективности действительно имеет значение (особенно если вы используете COBOL).Компилятор обычно все делает правильно.

2 голосов
/ 25 января 2012

В целом, все в порядке, и вы должны оставить оптимизацию своему компилятору.

Однако, поскольку исходный код написан для людей, чтобы понять, что создали предыдущие программисты, я бы сказал:

Используйте эту форму, если вероятно возникновение любого из условий:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF

Но в случае, если условие ЕСЛИ является очень редкой вещью, а безусловное ПЕРЕМЕЩЕНИЕ - это условие 99%, попробуйте этот подход, поскольку это подчеркивает тот факт, что VAR-A = FALSE - это редкая и особенная вещь:

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF

Просто мой NSH $ 0,02.Любой из них работает хорошо, если вы помните, что компилятор примет большую часть любой ерунды, которую вы ему кормите, ваша главная задача - следующий человек, который должен прочитать вашу программу.

1 голос
/ 06 апреля 2012

Первый более эффективен, если только VAR-A не равен , никогда false (в этом случае просто отбросьте его).Условие должно всегда выполняться, и всегда должно выполняться одно присвоение, так что это оптимально:

IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
ELSE
   MOVE VAR-A TO VAR-B
END-IF

Лично я предпочитаю сначала оценивать условия TRUE, для простоты чтения.

IF VAR-A = TRUE
   MOVE VAR-A TO VAR-B
ELSE
   MOVE VAR-C TO VAR-B
END-IF

Нет разницы в производительности, потому что в любом случае это одна ветвь.Если вы проверяли наличие нескольких значений, вам всегда нужно ставить самые общие на первый план.

EVALUATE TRUE
  WHEN VAR-A = TRUE
    MOVE VAR-A TO VAR-B
  WHEN VAR-C = TRUE
    MOVE VAR-C TO VAR-B
  WHEN OTHER
    this is slower, because it had to do two condition checks to get here
    MOVE VAR-C TO VAR-B
END-EVALUTE

Но это не относится к простому IF, как вы можете видеть:

IF condition
   no effort to get here
   assignment cost is constant
   one go-to to get to the next line
ELSE
   one go-to to get here
   assignment cost is constant
   no effort to get to the next line
END-IF

Но это действительно все придирки.Мы говорим о паре инструкций здесь.Если это не выполняется по внутреннему циклу, который выполняется 1 000 000 раз в минуту, даже не думайте об этом.

1 голос
/ 02 января 2012

Но я предпочитаю этот способ кодирования,

MOVE VAR-A TO VAR-B
IF VAR-A = FALSE
   MOVE VAR-C TO VAR-B
END-IF

Это потому, что для обработки / выполнения операторов условий / циклов / оценки компилятору необходимо обратить на них внимание и написать для этого эквивалентный код компилятора.,

For instance, if we have scenarios where FALSE scenario occurs for less than 50% then we can move the value into the variable for TRUE always, which may avoid going into the IF and IF with no ELSE is always less complex.

Что вы говорите?

1 голос
/ 27 декабря 2011

Перейдите по этой ссылке, Вам помогут

Заявление IF

...