### Gas优化学习笔记1-乘法比加法贵

• 老白
• 更新于 2023-11-06 11:29
• 阅读 752

<br>

<br>

• lowGas 通过加法 10+10 返回20
• highGas 通过乘法 10 * 2 返回20
``````    function lowGas()  public view returns(uint) {
uint x=10;
x = x + x;
return x;
}
function highGas() public view returns(uint)  {
uint x=10;
x = x * 2;
return x;
}``````

``````    modifier costGas(string memory name) {
uint beforeGas = gasleft();
_;
uint afterGas = gasleft();
console.log(name, concat("costGas: ", Strings.toString(beforeGas - afterGas)));
}``````

<br>

• console.log
• concat(string val1, string val2)
• toString(uint value) <br>

console.log， solidity本身不支持打印，需要调用 hardhat的包，可以通过import导入

``import "hardhat/console.sol";``

<br>

concat，EVM对字符串的支持度不能说没有，只能非常低。原因以后说。像字符串的拼接，在其他语言都是最常见的，在solidity需要自己实现。

``````    function concat(string memory value1, string memory value2) public pure returns(string memory result){
result = string(abi.encodePacked(value1, value2));
}``````

<br>

Strings.toString(), solidity不支持字符串拼接，自然也不会支持整形转为字符串。还好有OpenZeppelin

``import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.0/contracts/utils/Strings.sol";``

<br>

``````    function lowGas() costGas('lowGas') public view returns(uint) {
uint x=10;
x = x + x;
return x;
}

function highGas()  costGas('highGas') public view returns(uint)  {
uint x=10;
x = x * 2;
return x;
}``````

• .deps/github/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/Strings.sol
• .deps/npm/hardhat/console.sol

<br>

gas消耗 222

``````CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Ga1.lowGas()data: 0x895...b3373
console.log:
lowGas costGas: 222``````

<br>

gas消耗 285

``````CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Ga1.highGas()data: 0x62d...12eff
console.log:
highGas costGas: 285``````

<br>

*所以: gas(10 + 10) < gas(10 2)**

<br>

<br>

<br>

<br>

<br>

1） 编译界面，展开“>”符号

<br>

2） 允许优化

<br>

<br>

gas消耗 94

``````CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Ga1.lowGas()data: 0x895...b3373
console.log:
lowGas costGas: 94``````

lowGas 返回20，正确

gas消耗 110

``````CALL
[call]from: 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4to: Ga1.highGas()data: 0x62d...12eff
console.log:
highGas costGas: 110``````

<br>

lowGas 222
highGas 285
diff 63

owGas 94
highGas 110
diff 16

solc生成的bytecode不可能和我们的代码完全一样，bytecode内部一定包含了solc认为有用的检查代码和必要的出入栈操作。 <br>

2. 实际花费的gas要比 evm.code上看到的gas要多的多。

<br> <br>

<!--StartFragment-->

https://github.com/rickwang9/GasOptimization

<!--EndFragment-->

<!--StartFragment-->

# 引用

<!--EndFragment-->