展开循环
分析
for 循环内置了跳转指令,因此您可能需要考虑展开循环以节省 Gas。循环不必完全展开。例如,您可以一次执行两个循环,并将跳转指令的数量减半。
测试
文件位置:
src/compiler/UnRoll.sol
test/compiler/UnRoll.t.sol测试结果:
forge test --gas-report --mt test_unroll_ -vvv --optimize
根据测试结果,普通的展开循环,其实并没有gas优化;
但是如果我们把切换到汇编模式,即展开和未展开都使用汇编编写,此时展开循环就会有gas优化。
总结
这是一种非常极端的优化,但应该注意,条件跳转和循环会引入开销略大的操作码。
对应源码
本文配套代码固定到提交
8960383;Gas 数据会随编译器、优化器参数和 EVM 版本变化。