美文网首页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有限,但是第二种方法能使得代码更为简洁,因此很鼓励使用。

相关文章

  • mysql 索引优化

    索引的存储分类 索引的创建与删除 索引查看 mysql常用语句优化技巧定期优化表 常用优化 2.应尽量避免在whe...

  • JS数组遍历的几种方法

    for 最简单的一种循环遍历方法,也是使用频率最高的一种,可优化 优化:使用临时变量,将长度缓存起来,避免重复获取...

  • Deep-Learning-with-PyTorch-3.7.1

    3.7.1 索引到存储 让我们看看在2D点中实际上如何建立存储索引。 使用.storage属性可以访问给定张量的存...

  • JS中各种遍历方法

    数组遍历方法 for循环 (★★★☆☆) 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果...

  • Golang学习 - sync 包

    临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免...

  • 简析Local Storage和Session Storage的

    Local Storage:本地存储(永久,不清除一直在) Session Storage:本地存储(临时,浏览器...

  • js 数组遍历小结

    1、for循环使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。 2、fore...

  • gas优化: 避免对storage变量进行反复写入

    这是一个常见的优化方法,就是避免对storage的变量进行反复读写,如下两个合约所示: 两个合约做的核心操作是st...

  • MySQL FORCE INDEX 强制索引使用

    强制索引,即指定本次查询使用某个特定的索引,这样就可避免MySQL优化器使用低效的索引。 应用场景 当前需要统计当...

  • C++面经 ——数据库查询优化的方法

    使用索引尽量避免全局搜索,为经常被order where 、by、ground by的检索的字段建立索引。 优化s...

网友评论

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

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