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优化方案!