Gas
未經檢查的算術中的模運算是否更便宜?
Solidity v0.8.0 Breaking Changes上的文件提到現在預設檢查溢出:
算術運算在下溢和上溢時恢復。您可以使用unchecked { … }來使用之前的包裝行為。
但尚不清楚模運算 (%) 是否歸類為算術運算。根據文件:
無法使用 unchecked 塊禁用除以零或模零的檢查。
所以我的猜測是,在未經檢查的算術中,模不應該更快。那是對的嗎?
是的,模數在未經檢查的算術中更便宜!採取以下程式碼:
pragma solidity ^0.8.0; contract Modulos { function foo(uint256 x, uint256 y) external view returns (uint256 result, uint256 gasUsed) { uint256 startGas = gasleft(); result = x % y; gasUsed = startGas - gasleft(); } function bar(uint256 x, uint256 y) external view returns (uint256 result, uint256 gasUsed) { uint256 startGas = gasleft(); unchecked { result = x % y; gasUsed = startGas - gasleft(); } } }
x
將 11 和 3 分別作為和傳遞y
,產生以下氣體成本:
- 72氣
foo
- 23 氣
bar
您可以在Remix上親自測試。我不確定為什麼會這樣 - 根據我在問題正文中的解釋,我預計天然氣成本沒有差異。
側節點:您還可以使用程序集mod操作:
contract Modulos { function baz(uint256 x, uint256 y) external view returns (uint256 result, uint256 gasUsed) { uint256 startGas = gasleft(); assembly { result := mod(x, y) } gasUsed = startGas - gasleft(); } }
這與未經檢查的算術(23 gas)一樣多。