diff --git a/Cargo.lock b/Cargo.lock index b262d55..6b1830d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,6 +126,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + [[package]] name = "ansi_term" version = "0.12.1" @@ -783,6 +789,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + [[package]] name = "cc" version = "1.0.91" @@ -820,6 +832,33 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + [[package]] name = "cipher" version = "0.3.0" @@ -999,6 +1038,42 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap 3.2.25", + "criterion-plot", + "itertools 0.10.5", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + [[package]] name = "crossbeam-channel" version = "0.5.12" @@ -1659,6 +1734,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if 1.0.0", + "crunchy", +] + [[package]] name = "hash32" version = "0.2.1" @@ -2313,6 +2398,7 @@ dependencies = [ "async-channel", "async-trait", "clap 3.2.25", + "criterion", "futures 0.3.30", "itertools 0.10.5", "jsonrpc-core 18.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2765,6 +2851,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "oorandom" +version = "11.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" + [[package]] name = "opaque-debug" version = "0.3.1" @@ -3014,6 +3106,34 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "plotters" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" + +[[package]] +name = "plotters-svg" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +dependencies = [ + "plotters-backend", +] + [[package]] name = "polyval" version = "0.5.3" @@ -3753,6 +3873,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.23" @@ -5218,6 +5347,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -5793,6 +5932,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" diff --git a/connector/Cargo.toml b/connector/Cargo.toml index 5d8acb5..47915d0 100644 --- a/connector/Cargo.toml +++ b/connector/Cargo.toml @@ -8,6 +8,10 @@ description = "Listen to Solana account updates via geyser or websockets" [lib] +[[bench]] +name = "chaindata_bench" +harness = false + [features] default = [] @@ -51,3 +55,5 @@ yellowstone-grpc-proto = { workspace = true } [dev-dependencies] clap = { workspace = true } +# cannot upgrade due to clap_lex requirement MSRV 1.74 +criterion = "0.4.0" diff --git a/connector/benches/chaindata_bench.rs b/connector/benches/chaindata_bench.rs new file mode 100644 index 0000000..6b4c40a --- /dev/null +++ b/connector/benches/chaindata_bench.rs @@ -0,0 +1,44 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use mango_feeds_connector::chain_data::{update_slotvec_logic, AccountData}; +use solana_sdk::account::AccountSharedData; +use solana_sdk::pubkey::Pubkey; +use std::hint::black_box; + +fn given_v1235(dummy_account_data: AccountSharedData) -> Vec { + vec![ + AccountData { + slot: 10, + write_version: 10010, + account: dummy_account_data.clone(), + }, + AccountData { + slot: 20, + write_version: 10020, + account: dummy_account_data.clone(), + }, + AccountData { + slot: 30, + write_version: 10030, + account: dummy_account_data.clone(), + }, + // no 40 + AccountData { + slot: 50, + write_version: 10050, + account: dummy_account_data.clone(), + }, + ] +} + +fn criterion_benchmark(c: &mut Criterion) { + // overwrite if an entry for the slot already exists, otherwise insert + let dummy_account_data = AccountSharedData::new(99999999, 999999, &Pubkey::new_unique()); + let v = given_v1235(dummy_account_data); + + c.bench_function("update_slotvec_logic", |b| { + b.iter(|| update_slotvec_logic(black_box(&v), 40, 10040)) + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/connector/src/chain_data.rs b/connector/src/chain_data.rs index a243454..368a462 100644 --- a/connector/src/chain_data.rs +++ b/connector/src/chain_data.rs @@ -1,6 +1,6 @@ use crate::chain_data::SlotVectorEffect::*; -use log::trace; -use smallvec::{SmallVec, smallvec}; +use log::{info, trace}; +use smallvec::{smallvec, SmallVec}; use solana_sdk::clock::Slot; use { solana_sdk::account::{AccountSharedData, ReadableAccount}, @@ -184,7 +184,8 @@ impl ChainData { v.insert(smallvec![account]); } Entry::Occupied(o) => { - let v_effect = update_slotvec_logic(o.get().as_slice(), account.slot, account.write_version); + let v_effect = + update_slotvec_logic(o.get().as_slice(), account.slot, account.write_version); let v = o.into_mut();