60-Solidity8.0-gas简单优化

616 阅读1分钟

gas优化是一个很常见的问题,下面的小例子是对循环数组的一些优化,每做一点优化的改变就会节省一部分的gas!!!

最开始的代码:

看这个代码,思考一下,都有哪些可以优化的点呢?先不要看答案哦~


contract GasGolf {
    uint public total;

    //[1, 2, 3, 4, 5, 100]
    function sumIfEvenAndLessThan99(uint[] memory nums) external {
        for(uint i = 0; i < nums.length; i +=1) {
            bool isEven = nums[i] % 2 == 0;
            bool isLessThan99 = nums[i] < 99;
            if(isEven && isLessThan99) {
                total += nums[i];
            }
        }
    }
}

优化后:

pragma solidity ^0.8.7;

    // start - 58641
    // use calldata  -56538 memory改为callcalldata
    // load state variables to memory -56295  循环体中的变量改为内存中的变量
    // short circuit -55930 短路运算
    // loop increments -55481 ++i
    // cache array length -55441 缓存数组的长度
    // load array elements to memory -55255 把数组元素[i]提前拷贝到内存中
contract GasGolf {
    uint public total;

    //[1, 2, 3, 4, 5, 100]
    function sumIfEvenAndLessThan99(uint[] calldata nums) external {
        uint _total = total;
        uint len = nums.length;
        for(uint i = 0; i < len; ++i) {
            uint num = nums[i];
            if(num % 2 == 0 && num < 99 ) {
                _total += num;
            }
        }
        total = _total;
    }
}

你考虑全面了吗?内心有没有一些触动?

后面会写一篇更加详细具体的gas优化方案!