Оценка короткого замыкания: что вам нужно знать

Оценка короткого замыкания: что вам нужно знать

9 февраля 2023 г.

Всем привет. В этой статье я хочу поговорить о концепции, которая используется во многих языках программирования, и о том, как ею воспользоваться. У него много названий, таких как оценка Маккарти или минимальная оценка, но наиболее популярным названием является оценка короткого замыкания.

Что такое оценка короткого замыкания?

Прежде чем мы ответим на этот вопрос, давайте сначала рассмотрим две ситуации:

if (first && second) { }

В этом фрагменте кода, если первое условие оценивается как ложное, имеет ли значение второе значение для проверки, должно ли оно оценивать тело if или нет? Или что, если первое условие оценивается как истинное, а оператор Или (||) нет, и нужно ли нам оценивать второе?

n Ответ на оба вопроса отрицательный, потому что в выражении And (&&), если одно из значений ложно, это означает, что условие будет оцениваться как ложное; независимо от того, является ли другое значение истинным или ложным.

А в выражении Or (||), если первое истинно, нет необходимости проверять второе значение; во всех случаях он вернет true. п

false && true   --> false
false && false  --> false
true || true    --> true
true || false   --> true

В большинстве языков программирования процесс оценки второго аргумента в зависимости от первого выполняется автоматически и называется оценкой короткого замыкания.

Как вы можете воспользоваться преимуществами оценки короткого замыкания?

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

n У вас может быть два варианта упорядочения таких условий, например: n

public static boolean lengthFirst(String password) {
    return password.length() > 8 && pattern.matcher(password).matches();
}

public static boolean regexFirst(String password) {
     return pattern.matcher(password).matches() && password.length() > 8;
}

Если мы передаем правильный пароль, две функции будут одинаковыми, но что, если мы передаем неправильный пароль? Какой из них может быть быстрее и насколько быстрым он может быть по сравнению с другим? Давай проверим! п

String input = "one";

long lenStart = System.nanoTime();
lengthFirst(input);
long lenEnd = System.nanoTime() - lenStart;
System.out.println(lenEnd);

long regexStart = System.nanoTime();
regexFirst(input);
long regexEnd = System.nanoTime() - regexStart;
System.out.println(regexEnd);

Этот фрагмент кода будет печатать время выполнения каждой функции проверки; вывод на моей машине: n

6800
773900

Это означает, что первая функция примерно в 113 раз быстрее, но почему?

n Это различие связано с тем, что проверка длины строки выполняется намного быстрее, чем ее сопоставление с регулярным выражением; попробуйте сравнить их и проверить различия, вы получите почти одинаковый результат.

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

Как заказать условия для повышения эффективности?

Когда вы пишете выражения с несколькими условиями, вы должны подумать о том, как избежать вычисления больших условий или, другими словами, попытаться сначала вычислить маленькие условия, чтобы, если они вернут false, вы могли избежать других.< /p>

Обзор

Оценка короткого замыкания, как и многие другие полезные концепции программирования, не сложна и значительно повышает производительность.

Наслаждайтесь программированием 😋.


Также опубликовано здесь< /p>


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE