🕌

[Solidity] 配列・マップ操作にかかるガス代比較

2023/02/19に公開

配列とマップの各種操作に対するガス代比較です😃
使い分けを考える上で参考になれば!

結論 -> マップの方が安い

各操作ごとのガス代まとめ
総じてマップの方が安い!

操作 単位 配列 マップ
追加 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