美文网首页gas优化
gas优化:使用storage临时存储避免重复索引

gas优化:使用storage临时存储避免重复索引

作者: 梁帆 | 来源:发表于2023-03-22 14:32 被阅读0次

    在比较下面合约中的两个方法时:

    contract MyTest {
        uint256 public nonce = 0;
        mapping(address => mapping(uint256 => MyStruct)) public getStructByNonceByAccount;
    
        constructor(uint256 value_, bool isTrue_) {
            MyStruct memory _myStruct;
            _myStruct.account = msg.sender;
            _myStruct.value = value_;
            _myStruct.isTrue = isTrue_;
    
            getStructByNonceByAccount[msg.sender][nonce] = _myStruct;
    
            nonce++;
        }
    
        function getMyStructAttributes() external view returns(address, uint256, bool) {
            address account = getStructByNonceByAccount[msg.sender][0].account;
            uint256 value = getStructByNonceByAccount[msg.sender][0].value;
            bool isTrue = getStructByNonceByAccount[msg.sender][0].isTrue;
    
            return (account, value, isTrue);
        }
    
        function getMyStructAttributesWithTempStorage() external view returns(address, uint256, bool) {
            MyStruct storage myStruct = getStructByNonceByAccount[msg.sender][0];
            address account = myStruct.account;
            uint256 value = myStruct.value;
            bool isTrue = myStruct.isTrue;
    
            return (account, value, isTrue);
        }
    }
    
    函数 写入类型 gas消耗量
    getMyStructAttributes 重复索引 7528
    getMyStructAttributesWithTempStorage 以storage变量为中继 7291

    可以发现第二个方法 getMyStructAttributesWithTempStorage()更节约gas。原因如下:

    在第一个方法 getMyStructAttributes() 中,我们在每次调用该函数时都要使用 getStructByNonceByAccount()函数查询映射中的值,并将其存储在新的变量中。这意味着我们需要进行多次映射查询多次变量分配,从而增加了燃气成本。

    而在第二个方法 getMyStructAttributesWithTempStorage()中,我们首先将 MyStruct 变量存储在一个Storage变量中,然后使用该Storage变量进行映射访问和属性查询。这减少了映射访问和变量分配的次数,从而减少了燃气成本。

    因此,第二个方法更节约gas。虽然节约的gas有限,但是第二种方法能使得代码更为简洁,因此很鼓励使用。

    相关文章

      网友评论

        本文标题:gas优化:使用storage临时存储避免重复索引

        本文链接:https://www.haomeiwen.com/subject/gxtbrdtx.html