🕌
[Solidity] 配列・マップ操作にかかるガス代比較
配列とマップの各種操作に対するガス代比較です😃
使い分けを考える上で参考になれば!
結論 -> マップの方が安い
各操作ごとのガス代まとめ
総じてマップの方が安い!
操作 | 単位 | 配列 | マップ |
---|---|---|---|
追加 | gas | 76206 | 51073 |
更新 | gas | 30656 | 28213 |
削除 | gas | 47134 | 36271 |
デプロイ | gas | 315182 | 271601 |
読込(参考) | gas(execution) | 4934 | 2905 |
前提
- 環境 -> Remix
- Solidity -> 0.8.18
操作: 追加 -> マップの方が安い
ガス代
単位 | 配列 | マップ |
---|---|---|
gas | 76206 | 51073 |
テストコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
// 配列
contract TestGasArray {
address[] public array;
function addArray(address value) public {
array.push(value);
}
}
// マップ
contract TestGasMap {
mapping(uint256 => address) public map;
function addMap(uint256 key, address value) public {
map[key] = value;
}
}
操作: 更新 -> マップの方が安い
ガス代
単位 | 配列 | マップ |
---|---|---|
gas | 30656 | 28213 |
テストコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
// 配列
contract TestGasArray {
address[] public array;
function addArray(address value) public {
array.push(value);
}
function updateArray(uint256 index, address value) public {
array[index] = value;
}
}
// マップ
contract TestGasMap {
mapping(uint256 => address) public map;
function addMap(uint256 key, address value) public {
map[key] = value;
}
function updateMap(uint256 key, address value) public {
map[key] = value;
}
}
操作: 削除 -> マップの方が安い
ガス代
単位 | 配列 | マップ |
---|---|---|
gas | 47134 | 36271 |
テストコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
// 配列
contract TestGasArray {
address[] public array;
function addArray(address value) public {
array.push(value);
}
function updateArray(uint256 index, address value) public {
array[index] = value;
}
function deleteArray() public {
array.pop();
}
}
// マップ
contract TestGasMap {
mapping(uint256 => address) public map;
function addMap(uint256 key, address value) public {
map[key] = value;
}
function updateMap(uint256 key, address value) public {
map[key] = value;
}
function deleteMap(uint256 key) public {
delete map[key];
}
}
操作: デプロイ -> マップの方が安い
ガス代
単位 | 配列 | マップ |
---|---|---|
デプロイ | gas | 315182 |
テストコード
"削除" から変更なし
参考: 読込 -> マップの方が安い
内部的な計算のみで、実際にガス代が発生することはないが、ガスリミットには引っかかるので一応確認
ガス代
単位 | 配列 | マップ |
---|---|---|
gas(execution) | 4934 | 2905 |
テストコード
"削除" から変更なし
Discussion