-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: Benchmark contract state insertions with DB vs. DB transactions #1230
test: Benchmark contract state insertions with DB vs. DB transactions #1230
Conversation
…FuelLabs/fuel-core into bvrooman/chore/state-benchmarks
let mut elapsed_time = Duration::default(); | ||
for _ in 0..iters { | ||
let mut inner = outer.transaction(); | ||
let mut inner_db = VmDatabase::new::<GeneratedConsensusFields>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Originally, I was exploring if I could implement From<DatabaseTransaction>
for VmDatabase
to simplify this logic. The implementation meant using the default for GeneratedConsensusFields
, but that is only available under the test
or test-helpers
configuration. During benchmarking, neither of this flags are automatically available, and I did not think it would be valuable to require users to add a test configuration to their benchmarking at this time.
Hmm this seems strange, why is there such a big performance difference when there is a single contract vs multiple contract insert when using transactions?
|
It is SMT. In the case of one contract with |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for the benchmarks!=)
It seems the worst case is the insertion of a new state/balance into RocksDB with many entries.
We need to update our benchmark for all opcodes that insert something into the storage to include a huge pre-existing state. I think about 100_000_000
entries as a default value for benchmarks because after this value, the cost slows down, and it is almost impossible to have so many state/balance entries=)
Yes, as Green mentioned, the performance difference comes from the different size of SMTs at the time of insertion. In the "single contract" test cases, we are inserting an entry for a contract with preexisting leaves (i.e. 100,000 leaves for the above test case) and accumulating the Merkle tree. The biggest cost here is the tree traversal and update. In the "multiple contract" test cases, we are inserting entries for 100,000 new contracts, each with their own Merkle tree. Because these trees are new, updating them is very fast. |
## Release v0.20.0 The release brings a couple of new breaking changes from the [`fuel-vm 0.35.0`](https://github.com/FuelLabs/fuel-vm/releases/tag/v0.35.0) with bugfixes. Check the description of the VM release for more details. The `fuel-core` release mostly improved the internal codebase but also brought some breaking changes: - Removed `Trigger::Hybrid` PoA block trigger mode. Only `Trigger::Instante` and `Trigger::Interval` are available for block production now. The main mode for testnets and mainnet will be `Interval`. - Removed support for `OpaqueReceipt` and the `Receipt` type doesn't have the `raw_payload` field anymore. - A `Receipt` type got two new variants: `Mint` and `Burn`. The corresponding opcodes emit these new events. - The `AssetId` is derived from `ContractId` and additional nonce. So the `ContractId` and `AssetId` can't be the same anymore. ## What's Changed * bump rocksdb to enable compiling with GCC 13 by @segfault-magnet in #1219 * setting peer reputation params by @leviathanbeak in #1202 * Take into account the actually used gas by the transactions and fetch more transaction by @xgreenx in #1223 * Use production configuration for `fuel-core` during benches by @xgreenx in #1227 * Speedup and stabilize unit and integration tests by @xgreenx in #1231 * test: State benchmarks by @bvrooman in #1226 * Remove hybrid PoA block trigger mode by @Dentosal in #1232 * test: Benchmark contract state insertions with DB vs. DB transactions by @bvrooman in #1230 * multiplatform docker builds by @Voxelot in #1233 * Fix typo in architecture.md by @eltociear in #1241 * Expose gas cost in chain info by @MitchTurner in #1244 * Reuse calculated tx id in executor by @MitchTurner in #1248 * Fix multi-platform images by @Voxelot in #1251 * Add logging of the long GraphQL queries for future debug by @MitchTurner in #1250 * Reused `CheckedTransaction` from transaction pool in the executor by @xgreenx in #1249 * Bump `fuel-vm` to `0.35.0` version by @xgreenx in #1256 ## New Contributors * @segfault-magnet made their first contribution in #1219 * @eltociear made their first contribution in #1241 * @MitchTurner made their first contribution in #1244 **Full Changelog**: v0.19.1...v0.20.0
## Release v0.20.0 The release brings a couple of new breaking changes from the [`fuel-vm 0.35.0`](https://github.com/FuelLabs/fuel-vm/releases/tag/v0.35.0) with bugfixes. Check the description of the VM release for more details. The `fuel-core` release mostly improved the internal codebase but also brought some breaking changes: - Removed `Trigger::Hybrid` PoA block trigger mode. Only `Trigger::Instante` and `Trigger::Interval` are available for block production now. The main mode for testnets and mainnet will be `Interval`. - Removed support for `OpaqueReceipt` and the `Receipt` type doesn't have the `raw_payload` field anymore. - A `Receipt` type got two new variants: `Mint` and `Burn`. The corresponding opcodes emit these new events. - The `AssetId` is derived from `ContractId` and additional nonce. So the `ContractId` and `AssetId` can't be the same anymore. ## What's Changed * bump rocksdb to enable compiling with GCC 13 by @segfault-magnet in FuelLabs/fuel-core#1219 * setting peer reputation params by @leviathanbeak in FuelLabs/fuel-core#1202 * Take into account the actually used gas by the transactions and fetch more transaction by @xgreenx in FuelLabs/fuel-core#1223 * Use production configuration for `fuel-core` during benches by @xgreenx in FuelLabs/fuel-core#1227 * Speedup and stabilize unit and integration tests by @xgreenx in FuelLabs/fuel-core#1231 * test: State benchmarks by @bvrooman in FuelLabs/fuel-core#1226 * Remove hybrid PoA block trigger mode by @Dentosal in FuelLabs/fuel-core#1232 * test: Benchmark contract state insertions with DB vs. DB transactions by @bvrooman in FuelLabs/fuel-core#1230 * multiplatform docker builds by @Voxelot in FuelLabs/fuel-core#1233 * Fix typo in architecture.md by @eltociear in FuelLabs/fuel-core#1241 * Expose gas cost in chain info by @MitchTurner in FuelLabs/fuel-core#1244 * Reuse calculated tx id in executor by @MitchTurner in FuelLabs/fuel-core#1248 * Fix multi-platform images by @Voxelot in FuelLabs/fuel-core#1251 * Add logging of the long GraphQL queries for future debug by @MitchTurner in FuelLabs/fuel-core#1250 * Reused `CheckedTransaction` from transaction pool in the executor by @xgreenx in FuelLabs/fuel-core#1249 * Bump `fuel-vm` to `0.35.0` version by @xgreenx in FuelLabs/fuel-core#1256 ## New Contributors * @segfault-magnet made their first contribution in FuelLabs/fuel-core#1219 * @eltociear made their first contribution in FuelLabs/fuel-core#1241 * @MitchTurner made their first contribution in FuelLabs/fuel-core#1244 **Full Changelog**: FuelLabs/fuel-core@v0.19.1...v0.20.0
Related issues:
This PR adds additional benches to compare the performance of inserting state when the existing data is 1) written to the database, and 2) stored in-memory in a transaction. The results demonstrate that when preexisting data is held in a transaction, inserting state has constant complexity and is generally faster, and performance degradation comes from the logarithmic complexity of Merkle tree insertion.