solidityのmappingのvalueは小さくしたほうが安いのか検証2
今度はmappingのvalueが構造体の場合を検証。
構造体の中身は、初回は小さいほどgasが安いが、
2回め以降は変わらない。というかそれほど構造体のパッキングは
gas節約に寄与しないような気がしてきた。
ropstenがおかしいのかな。
でもmainnetでの検証はおかねかかるからやりたくない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
pragma solidity ^0.4.18; contract GasTest2 { struct SaleAuction32 { address seller; uint32 startPrice; uint32 endPrice; uint32 startTimeSec; uint32 durationSec; } struct SaleAuction128 { address seller; uint128 startPrice; uint128 endPrice; uint32 startTimeSec; uint32 durationSec; } struct SaleAuction256 { address seller; uint256 startPrice; uint256 endPrice; uint32 startTimeSec; uint32 durationSec; } mapping(address => SaleAuction32) mapSale32; mapping(address => SaleAuction128) mapSale128; mapping(address => SaleAuction256) mapSale256; function setSale256() public { SaleAuction256 storage sale = mapSale256[msg.sender]; sale.seller = msg.sender; sale.startPrice++; sale.endPrice++; sale.startTimeSec++; sale.durationSec++; } function setSale128() public { SaleAuction128 storage sale = mapSale128[msg.sender]; sale.seller = msg.sender; sale.startPrice++; sale.endPrice++; sale.startTimeSec++; sale.durationSec++; } function setSale32 () public { SaleAuction32 storage sale = mapSale32[msg.sender]; sale.seller = msg.sender; sale.startPrice++; sale.endPrice++; sale.startTimeSec++; sale.durationSec++; } } |
1 2 3 4 5 |
ガスコスト 関数 1回目 2回目 3回目 setSale256 108452 48452 48452 setSale128 94114 49114 49114 setSale32 79258 49258 49258 |
senderを毎回変えるとまた違った結果になると思います。同じsenderで複数回呼び出す場合は書き換え分のガスコストのみしかかからないので差がわかりにくくなります。
1回目のgas消費量から2回目のgas消費量を引くといくつのstorage枠使ってるのかわかりますね
nakajo先輩コメントありがとうございます!
同じsenderだと書き換え分のガスコストのみしかかからないのですか〜!
知るよしもありませんでした 笑