About Gas

Gas优化

  1. 变量声明为constant immutable 使用位运算符

  2. 函数参数声明为calldata memory

  3. 循环使用unchecked避免溢出检查

  4. uint256占满32字节插槽最节省gas,变量打包(在一个插槽中放置多个变量)

  5. revert配合error最省gas,同时可以携带变量。require的gas随字符串长度增加

  6. 运算中使用局部变量

  7. 创造子合约时 clone > new > create2

  8. 增加使用i = i +n,递增使用 ++i

  9. 重入保护中,使用Uint12 > Uint01 > Bool,0到非0转换会消耗大量gas

  10. "<" 和 ">"比"≤" 和 "≥"更加高效,EVM没有针对"≤" 和 "≥"的OPCODE

  11. 通过优化函数名,增加calldata中方法id的0字节的个数来节省gas(0字节消耗 4 gas,非0字节消耗 16 gas)

  12. 合约内所有函数是一个数组,调用时会先遍历,通过排序函数减少遍历复杂度

  13. 短路判断,update后delete变量或恢复初始值,创建变量时不赋值(使用初始值)

  14. 构造函数非payable,使用bytes32存字符串,使用定长数组,使用事件存储数据,mapping操作比array便宜