这是一个常见的优化方法,就是避免对storage的变量进行反复读写,如下两个合约所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
contract A {
uint state = 0;
function addTimes() external {
for(uint i = 0; i < 100; i++) {
state++;
}
}
}
contract B {
uint state = 0;
function addTimes() external {
uint t = state;
for(uint i = 0; i < 100; i++) {
t++;
}
state = t;
}
}
两个合约做的核心操作是storage变量state累加100次。在A合约中,每一次累加,都是直接对state进行写入;而B合约中,是先定义了一个栈变量t
,先对t进行累加,累加完成后赋值给state
。gas消耗量统计如下:
合约 | 写入方式 | gas消耗量 |
---|---|---|
A | 反复写入 | 117531 |
B | 最后写入 | 75445 |
可以发现,这个gas消耗量差别还是比较大的。所以在工作中要注意这类的gas优化。