Skip to content

Commit

Permalink
more meaningful gas reports by not loading tableId/key from storage
Browse files Browse the repository at this point in the history
  • Loading branch information
alvrs committed Sep 24, 2023
1 parent c62fd79 commit 26c3b9a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 30 deletions.
16 changes: 8 additions & 8 deletions packages/store/gas-report.json
Expand Up @@ -627,49 +627,49 @@
"file": "test/StoreCoreDynamic.t.sol",
"test": "testGetSecondFieldLength",
"name": "get field length (cold, 1 slot)",
"gasUsed": 7795
"gasUsed": 3163
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testGetSecondFieldLength",
"name": "get field length (warm, 1 slot)",
"gasUsed": 1790
"gasUsed": 1160
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testGetThirdFieldLength",
"name": "get field length (warm due to , 2 slots)",
"gasUsed": 7794
"gasUsed": 3163
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testGetThirdFieldLength",
"name": "get field length (warm, 2 slots)",
"gasUsed": 1790
"gasUsed": 1160
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testPopFromSecondField",
"name": "pop from field (cold, 1 slot, 1 uint32 item)",
"gasUsed": 18728
"gasUsed": 18097
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testPopFromSecondField",
"name": "pop from field (warm, 1 slot, 1 uint32 item)",
"gasUsed": 12736
"gasUsed": 12104
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testPopFromThirdField",
"name": "pop from field (cold, 2 slots, 10 uint32 items)",
"gasUsed": 16496
"gasUsed": 15865
},
{
"file": "test/StoreCoreDynamic.t.sol",
"test": "testPopFromThirdField",
"name": "pop from field (warm, 2 slots, 10 uint32 items)",
"gasUsed": 12504
"gasUsed": 11872
},
{
"file": "test/StoreCoreGas.t.sol",
Expand Down
52 changes: 30 additions & 22 deletions packages/store/test/StoreCoreDynamic.t.sol
Expand Up @@ -85,6 +85,8 @@ contract StoreCoreDynamicTest is Test, GasReporter, StoreMock {
function testPopFromSecondField() public {
FieldLayout fieldLayout = StoreCore.getFieldLayout(_tableId);
bytes memory dataBytes = secondDataBytes;
ResourceId tableId = _tableId;
bytes32[] memory keyTuple = _keyTuple;

// Prepare expected data
uint256 byteLengthToPop = 1 * 4;
Expand All @@ -96,8 +98,8 @@ contract StoreCoreDynamicTest is Test, GasReporter, StoreMock {
// Expect a StoreSpliceRecord event to be emitted
vm.expectEmit(true, true, true, true);
emit Store_SpliceDynamicData(
_tableId,
_keyTuple,
tableId,
keyTuple,
uint48(secondDataBytes.length - byteLengthToPop),
uint40(byteLengthToPop),
new bytes(0),
Expand All @@ -106,31 +108,33 @@ contract StoreCoreDynamicTest is Test, GasReporter, StoreMock {

// Pop from second field
startGasReport("pop from field (cold, 1 slot, 1 uint32 item)");
StoreCore.popFromDynamicField(_tableId, _keyTuple, 0, byteLengthToPop);
StoreCore.popFromDynamicField(tableId, keyTuple, 0, byteLengthToPop);
endGasReport();
// Get second field
bytes memory loadedData = StoreCore.getField(_tableId, _keyTuple, 1, fieldLayout);
bytes memory loadedData = StoreCore.getField(tableId, keyTuple, 1, fieldLayout);
// Verify loaded data is correct
assertEq(loadedData, newDataBytes);

// Reset the second field and pop again (but warm this time)
StoreCore.setField(_tableId, _keyTuple, 1, dataBytes, fieldLayout);
StoreCore.setField(tableId, keyTuple, 1, dataBytes, fieldLayout);
startGasReport("pop from field (warm, 1 slot, 1 uint32 item)");
StoreCore.popFromDynamicField(_tableId, _keyTuple, 0, byteLengthToPop);
StoreCore.popFromDynamicField(tableId, keyTuple, 0, byteLengthToPop);
endGasReport();
// Get second field
loadedData = StoreCore.getField(_tableId, _keyTuple, 1, fieldLayout);
loadedData = StoreCore.getField(tableId, keyTuple, 1, fieldLayout);
// Verify loaded data is correct
assertEq(loadedData, newDataBytes);

// Verify none of the other fields were impacted
assertEq(bytes32(StoreCore.getField(_tableId, _keyTuple, 0, fieldLayout)), firstDataBytes);
assertEq(StoreCore.getField(_tableId, _keyTuple, 2, fieldLayout), thirdDataBytes);
assertEq(bytes32(StoreCore.getField(tableId, keyTuple, 0, fieldLayout)), firstDataBytes);
assertEq(StoreCore.getField(tableId, keyTuple, 2, fieldLayout), thirdDataBytes);
}

function testPopFromThirdField() public {
FieldLayout fieldLayout = StoreCore.getFieldLayout(_tableId);
bytes memory dataBytes = thirdDataBytes;
ResourceId tableId = _tableId;
bytes32[] memory keyTuple = _keyTuple;

// Prepare expected data
uint256 byteLengthToPop = 10 * 4;
Expand All @@ -142,8 +146,8 @@ contract StoreCoreDynamicTest is Test, GasReporter, StoreMock {
// Expect a StoreSpliceRecord event to be emitted after pop
vm.expectEmit(true, true, true, true);
emit Store_SpliceDynamicData(
_tableId,
_keyTuple,
tableId,
keyTuple,
uint48(secondDataBytes.length + thirdDataBytes.length - byteLengthToPop),
uint40(byteLengthToPop),
new bytes(0),
Expand All @@ -152,48 +156,52 @@ contract StoreCoreDynamicTest is Test, GasReporter, StoreMock {

// Pop from the field
startGasReport("pop from field (cold, 2 slots, 10 uint32 items)");
StoreCore.popFromDynamicField(_tableId, _keyTuple, 1, byteLengthToPop);
StoreCore.popFromDynamicField(tableId, keyTuple, 1, byteLengthToPop);
endGasReport();
// Load and verify the field
bytes memory loadedData = StoreCore.getField(_tableId, _keyTuple, 2, fieldLayout);
bytes memory loadedData = StoreCore.getField(tableId, keyTuple, 2, fieldLayout);
assertEq(loadedData, newDataBytes);

// Reset the field and pop again (but warm this time)
StoreCore.setField(_tableId, _keyTuple, 2, dataBytes, fieldLayout);
StoreCore.setField(tableId, keyTuple, 2, dataBytes, fieldLayout);
startGasReport("pop from field (warm, 2 slots, 10 uint32 items)");
StoreCore.popFromDynamicField(_tableId, _keyTuple, 1, byteLengthToPop);
StoreCore.popFromDynamicField(tableId, keyTuple, 1, byteLengthToPop);
endGasReport();
// Load and verify the field
loadedData = StoreCore.getField(_tableId, _keyTuple, 2, fieldLayout);
loadedData = StoreCore.getField(tableId, keyTuple, 2, fieldLayout);
assertEq(loadedData, newDataBytes);

// Verify none of the other fields were impacted
assertEq(bytes32(StoreCore.getField(_tableId, _keyTuple, 0, fieldLayout)), firstDataBytes);
assertEq(StoreCore.getField(_tableId, _keyTuple, 1, fieldLayout), secondDataBytes);
assertEq(bytes32(StoreCore.getField(tableId, keyTuple, 0, fieldLayout)), firstDataBytes);
assertEq(StoreCore.getField(tableId, keyTuple, 1, fieldLayout), secondDataBytes);
}

function testGetSecondFieldLength() public {
FieldLayout fieldLayout = StoreCore.getFieldLayout(_tableId);
ResourceId tableId = _tableId;
bytes32[] memory keyTuple = _keyTuple;

startGasReport("get field length (cold, 1 slot)");
uint256 length = StoreCore.getFieldLength(_tableId, _keyTuple, 1, fieldLayout);
uint256 length = StoreCore.getFieldLength(tableId, keyTuple, 1, fieldLayout);
endGasReport();
assertEq(length, secondDataBytes.length);
startGasReport("get field length (warm, 1 slot)");
length = StoreCore.getFieldLength(_tableId, _keyTuple, 1, fieldLayout);
length = StoreCore.getFieldLength(tableId, keyTuple, 1, fieldLayout);
endGasReport();
assertEq(length, secondDataBytes.length);
}

function testGetThirdFieldLength() public {
FieldLayout fieldLayout = StoreCore.getFieldLayout(_tableId);
ResourceId tableId = _tableId;
bytes32[] memory keyTuple = _keyTuple;

startGasReport("get field length (warm due to , 2 slots)");
uint256 length = StoreCore.getFieldLength(_tableId, _keyTuple, 2, fieldLayout);
uint256 length = StoreCore.getFieldLength(tableId, keyTuple, 2, fieldLayout);
endGasReport();
assertEq(length, thirdDataBytes.length);
startGasReport("get field length (warm, 2 slots)");
length = StoreCore.getFieldLength(_tableId, _keyTuple, 2, fieldLayout);
length = StoreCore.getFieldLength(tableId, keyTuple, 2, fieldLayout);
endGasReport();
assertEq(length, thirdDataBytes.length);
}
Expand Down

0 comments on commit 26c3b9a

Please sign in to comment.