Solidity
哪個更快:合約內循環或交易循環?
我有這個契約:
pragma solidity 0.5; pragma experimental ABIEncoderV2; contract TestStruct { struct User { string name; uint256 age; } mapping (bytes32 => User) users; function addManyUsers (User [] memory _users) public { for (uint i = 0; i < _users.length; i++) { bytes32 hash = keccak256(abi.encode(_users[i].name)); users[hash] = _users[i]; } } function addOneUser (User memory _user) public { bytes32 hash = keccak256(abi.encode(_user.name)); users[hash] = _user; } function getUser (string memory username) public view returns (User memory) { bytes32 hash = keccak256(abi.encode(username)); return users[hash]; } }
假設我們有一個包含 100 個使用者的列表,
在執行方面哪個更快:一個一個插入(使用
addOneUser
)或一次插入所有一個(使用addManyUsers
)?
使用它會更快(更便宜)
addManyUsers()
。在速度方面,區塊鏈同時處理所有復雜性的交易(每個區塊)。您應該關心的是 gas 成本和發送的交易數量。
在從交易選擇中確定最佳選擇時,您應該考慮這些交易的總 gas 成本。請記住,交易中的每個操作碼都有一定的相關成本。
要考慮的另一件事是交易數量。一般來說,更多的交易會花費更多,因為每筆新的交易都有很大的前期 gas 成本。正因為如此,執行
addManyUsers()
2-3 次以上的交易會便宜得多(一次完成所有交易可能會導致你達到塊 gas 限制),而不是addOneUser()
100 次,因為 100 次交易的交易成本將大於2-3 筆交易。