Короткое замыкание

Основная цель использования замыкания в любом языке кодирования — уменьшить количество вычислений, выполняемых во время операций сравнения. А в солидности уменьшение вычислений означает уменьшение газа.

Рассмотрим следующие контракты:

contract shortCircuit1 {
    bool flag;

    function conditions(int x) external {
        bool isEven = x % 2 == 0;  // computation 1
        bool isNotZero = x != 0;   // computation 2

        if (isEven && isNotZero) { // computation 3
            flag = true;
        } else {
            flag = false;
        }
    }
}


contract shortCircuit2 {
    bool flag;

    function conditions(int x) external {

        if (x % 2 == 0 && x != 0) { // 3 computations only if x % 2 == 0 is true, else only 1 computation
            flag = true;
        } else {
            flag = false;
        }
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Оба контракта выполняют одинаковые условия, вход в функцию должен быть четным и больше 0. Если условия истинны, то переменная состояния flag устанавливается в true. Если же предыдущий вызов функции сделал flag истинным, а следующий вызов не удовлетворяет обоим условиям, то flag устанавливается в false.
Теперь давайте сосредоточимся на условиях, записанных внутри функций.

короткое замыкание1
вход функции — 0
вычисляет оба условия, а затем выполняет 3-е вычисление, чтобы проверить, истинны ли оба условия.

замыкание2
вход функции — 0
вычисляет второе условие, только если первое условие истинно (короткое замыкание). Таким образом, экономится стоимость вычислений.

Примечание:- Для приведенных примеров разница в газе очень мала. Представьте себе длительное вычисление сравнения (скажем, строк или массивов), в таких случаях разница в газе будет значительной.

Оцените статью
Procodings.ru
Добавить комментарий