Solidity
Solidity 是否預先計算了函式體中定義的兩個的冪?
我只在我的合約函式中使用了二合一的權力,但我在頂層定義了它們,認為這樣我可以在執行時節省氣體。
那有必要嗎?使用 Solidity 優化器時,我可以執行以下操作並產生相同的 gas 成本嗎?
function foo(uint256 x) external returns (uint256 result) { if (x >= 2**128) { // ... } if (x >= 2**64) { // ... } // ... }
是的,即使沒有啟用優化器,它也會記憶體數字!
當傳遞 65535 (max uint16) 作為參數 x 時,執行
foo
或需要 1003 gasbar
。我在Remix上使用 Solidity v0.8.3 執行了這個測試。contract PowersOfTwo { uint256 internal constant TWO_POW_1 = 2**1; uint256 internal constant TWO_POW_2 = 2**2; uint256 internal constant TWO_POW_4 = 2**4; uint256 internal constant TWO_POW_8 = 2**8; function foo(uint16 x) external view returns(uint256 gasConsumed) { uint256 startGas = gasleft(); uint256 msb = 0; if (x >= TWO_POW_8) { x >>= 8; msb += 8; } if (x >= TWO_POW_4) { x >>= 4; msb += 4; } if (x >= TWO_POW_2) { x >>= 2; msb += 2; } if (x >= TWO_POW_1) { msb += 1; } gasConsumed = startGas - gasleft(); } function bar(uint16 x) external view returns(uint256 gasConsumed) { uint256 startGas = gasleft(); uint256 msb = 0; if (x >= 2**8) { x >>= 8; msb += 8; } if (x >= 2**4) { x >>= 4; msb += 4; } if (x >= 2**2) { x >>= 2; msb += 2; } if (x >= 2**1) { msb += 1; } gasConsumed = startGas - gasleft(); } }