Что лучше для производительности? И против AndAlso
При написании оператора If я всегда использовал And
при необходимости, например:
If 1=1 And 2=2 Then
Единственный раз, когда я когда-либо использовал AndAlso
, - это если второе условие будет ошибочным, если первое не верно:
If Not IsDbNull(Value) AndAlso Value=2 Then
Однако в последнее время я слышал, что AndAlso
лучше для производительности, чем And
, поскольку второе условие читается только тогда, когда первое истинно.
В этом случае, должен ли я всегда использовать AndAlso
?
Ответы
Ответ 1
Да, AndAlso
может быть быстрее, чем And
, потому что он не оценивает последующие условия, если более раннее условие доказывает ложность.
And
- это возврат к более ранним версиям Visual Basic.
Большинство (я стесняюсь сказать все), что современные языки используют логические операторы, условия короткого замыкания, которые не нужно строго оценивать.
например. &&
оператор и для языков стиля C выполняются как AndAlso
.
Будьте осторожны, если у вас много кода, который использует And
и Or
, глобальный поиск и замена могут изменить существующее поведение, если второе условие связано с вызовом функции, который имеет побочные эффекты.
Я бы предпочел использовать AndAlso
и OrElse
, если вы специально не требуете функций, предоставляемых And
и Or
Ответ 2
Исходя из фона C и С++ в VB (V5 изначально), всегда было очень неприятно, что VB and
и or
не замыкались. Поэтому случай, когда второе выражение зависело от первого, всегда было труднее записать.
Я бы не ожидал увидеть большую часть увеличения производительности в большинстве случаев, если у второго выражения не будет значительных накладных расходов, операторы с коротким замыканием не смогут выполнить его и тем самым ускорить процесс.
Но если это второе выражение является значительным накладным расходами, я буду беспокоиться о побочных эффектах, которые будут выполняться иногда только потому, что это затруднит работу в будущем и может сделать правильность более сложной.
Ответ 3
Когда условия также являются функциями:
If functionA() And functionB() Then
...
public shared functionA() As Boolean
IF A is false THEN log -> return true or false
...
public shared functionB() As Boolean
IF B is false THEN log -> return true or false
Использование AndAlso
здесь может быть неправильным способом, потому что тогда он будет записывать только B, когда оба A и B являются ложными.