在Solidity中,把数组的length提前缓存到一个局部变量中(即“前置计算”),主要是为了避免在循环的每次判断中重复读取同一个状态变量(或内存变量),从而把多次操作压缩为一次。这在storage数组上效果最明显,但也适用于memory和calldata数组。缓存后如何省
在 Solidity 中,把数组的 length 提前缓存到一个局部变量中(即“前置计算”),主要是为了避免在循环的每次判断中重复读取同一个状态变量(或内存变量),从而把多次操作压缩为一次。这在 storage 数组上效果最明显,但也适用于 memory 和 calldata 数组。
缓存后如何省 Gas?—— 把 O(n) 次读压缩为 1 次。
未缓存版本(多次存储读):
uint[] public numbers; // storage 数组
function sumUncached() external view returns (uint total) {
for (uint i = 0; i < numbers.length; ) {
total += numbers[i]; // 每次循环都要 SLOAD length 和 SLOAD 元素
unchecked { ++i; }
}
}
缓存版本(一次存储读):
function sumCached() external view returns (uint total) {
uint length = numbers.length; // 一次 SLOAD,存入局部变量(栈/内存)
for (uint i = 0; i < length; ) {
total += numbers[i];
unchecked { ++i; }
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码