Gas

未經檢查的算術中的模運算是否更便宜?

  • April 16, 2021

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)一樣多。

引用自:https://ethereum.stackexchange.com/questions/97021