gas优化之前置计算 array.length

  • iszzm123
  • 发布于 21 小时前
  • 阅读 24

在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; }
	}
}
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
iszzm123
iszzm123
最近有应聘的意向