# Solidity中一种高效通过代码减少gas消耗的方法

By [Renaissance Labs](https://paragraph.com/@renaissance-labs) · 2022-03-01

---

![ART](https://storage.googleapis.com/papyrus_images/95401af71cd7e0f04046e8f97154293a17ef6955db01185a92eed4731bbf2896.png)

ART

主要是通过代码中memory来大幅度减少gas使用，示例代码如下：

    pragma solidity ^0.5.10;
    
    contract Test{
        
        struct User{
            uint age;
            uint balance;
            uint num;
        }
        
        User user;
        
        function initUser() public{
            user = User({age:20,balance:1000,num:1});
        }
        
        function setUser1() public {
            user.age = 30;
            user.balance = 20000;
            user.num = 2;
        }
        
        function setUser2() public {
            User memory temp = user;
            temp.age = 40;
            temp.age = 20001;
            user.num = 3;
            user = temp;
        }
    }
    pragma solidity ^0.5.10;
    
    contract Test{
        
        struct User{
            uint age;
            uint balance;
            uint num;
        }
        
        User user;
        
        function initUser() public{
            user = User({age:20,balance:1000,num:1});
        }
        
        function setUser1() public {
            user.age = 30;
            user.balance = 20000;
            user.num = 2;
        }
        
        function setUser2() public {
            User memory temp = user;
            temp.age = 40;
            temp.age = 20001;
            user.num = 3;
            user = temp;
        }
    }
    

我们首先通过initUser方法来初始化一个User对象的数据，然后分别调用setUser1和setUser2两个方法。

你会发现，setUser1需要消耗36476gas，而setUser2只需要效果31595gas，它们的效果相同，消耗的gas却差了5000gas，如果User的字段增多，那么此差距会越来越大。

那么这两种写法的区别是什么呢？我们知道，区块链上的写操作是比较昂贵的，而setUser1进行了多次的写操作，而setUser2只进行了一次整体的写操作。因此，节省了相当大一部分的gas。

---

*Originally published on [Renaissance Labs](https://paragraph.com/@renaissance-labs/solidity-gas)*
