This commit is contained in:
parent
699478f85e
commit
760f6d9415
33
Cargo.lock
generated
33
Cargo.lock
generated
@ -314,7 +314,7 @@ dependencies = [
|
||||
"bincode",
|
||||
"chgk_ledb_lib",
|
||||
"clap 4.3.16",
|
||||
"criterion",
|
||||
"criterion 0.4.0",
|
||||
"rand",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
@ -327,11 +327,14 @@ dependencies = [
|
||||
name = "chgk_ledb_async"
|
||||
version = "1.1.0"
|
||||
dependencies = [
|
||||
"async-compression 0.4.1",
|
||||
"async_zip",
|
||||
"bincode",
|
||||
"chgk_ledb_lib",
|
||||
"clap 4.3.16",
|
||||
"criterion 0.5.1",
|
||||
"futures",
|
||||
"lazy_static",
|
||||
"rand",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
@ -532,6 +535,34 @@ dependencies = [
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "criterion"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
|
||||
dependencies = [
|
||||
"anes",
|
||||
"cast",
|
||||
"ciborium",
|
||||
"clap 4.3.16",
|
||||
"criterion-plot",
|
||||
"futures",
|
||||
"is-terminal",
|
||||
"itertools",
|
||||
"num-traits",
|
||||
"once_cell",
|
||||
"oorandom",
|
||||
"plotters",
|
||||
"rayon",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"tinytemplate",
|
||||
"tokio",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "criterion-plot"
|
||||
version = "0.5.0"
|
||||
|
@ -9,6 +9,10 @@ description = "Утилита загружающая базу данных ЧГ
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[[bench]]
|
||||
name = "async_bench"
|
||||
harness = false
|
||||
|
||||
[dependencies]
|
||||
chgk_ledb_lib = {path = "../lib", features = ["async", "convert_async"]}
|
||||
serde_json="1.0"
|
||||
@ -27,7 +31,11 @@ clap = { version = "4.2.7", features = ["derive"] }
|
||||
futures = "0.3"
|
||||
|
||||
[dev-dependencies]
|
||||
criterion = { version = "0.5.1", features = ["async_tokio"]}
|
||||
tempfile = "3.3"
|
||||
bincode = "^2.0.0-rc.2"
|
||||
serde="1.0"
|
||||
serde_derive="1.0"
|
||||
futures = "0.3"
|
||||
async-compression = { version = "0.4.1", default-features = false }
|
||||
lazy_static = "1.4.0"
|
||||
|
153
app_async/benches/async_bench.rs
Normal file
153
app_async/benches/async_bench.rs
Normal file
@ -0,0 +1,153 @@
|
||||
#[macro_use]
|
||||
extern crate criterion;
|
||||
extern crate bincode;
|
||||
extern crate serde;
|
||||
extern crate serde_derive;
|
||||
extern crate tempfile;
|
||||
|
||||
use async_compression::Level;
|
||||
use chgk_ledb_lib::async_db::{Reader, Writer, WriterOpts};
|
||||
use futures::StreamExt;
|
||||
use std::{ops::Deref, path::Path};
|
||||
|
||||
use criterion::{BatchSize, Criterion};
|
||||
use lazy_static::lazy_static;
|
||||
use tempfile::{tempdir, NamedTempFile};
|
||||
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
|
||||
#[derive(
|
||||
bincode::Encode,
|
||||
bincode::Decode,
|
||||
Clone,
|
||||
Debug,
|
||||
PartialEq,
|
||||
Eq,
|
||||
PartialOrd,
|
||||
Ord,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
)]
|
||||
struct TestData {
|
||||
num1: u64,
|
||||
num2: u64,
|
||||
test: String,
|
||||
}
|
||||
|
||||
use tokio::runtime;
|
||||
|
||||
lazy_static! {
|
||||
static ref RUNTIME: tokio::runtime::Runtime =
|
||||
runtime::Builder::new_current_thread().build().unwrap();
|
||||
}
|
||||
|
||||
const N: usize = 4096;
|
||||
|
||||
fn gen_data(count: usize) -> impl Iterator<Item = TestData> {
|
||||
(0..count).map(|i| 143 + i as u64).map(|i| TestData {
|
||||
num1: i,
|
||||
num2: (i * 100) ^ 0xDF0E441122334455,
|
||||
test: "test ---- Test ____".repeat(123 + i as usize % 15),
|
||||
})
|
||||
}
|
||||
|
||||
async fn prepare_db_writer<P: AsRef<Path>>(path: P) -> Writer<TestData> {
|
||||
let opts = WriterOpts {
|
||||
compress_lvl: Level::Fastest,
|
||||
data_buf_size: 100 * 1024 * 1024,
|
||||
out_buf_size: 100 * 1024 * 1024,
|
||||
current_buf_size: 10240,
|
||||
};
|
||||
|
||||
Writer::new(path, opts).await.expect("new writer")
|
||||
}
|
||||
|
||||
fn write_sample<P: AsRef<Path>>(path: P) {
|
||||
let rp = path.as_ref().to_str().unwrap().to_string();
|
||||
std::thread::spawn(|| {
|
||||
runtime::Builder::new_current_thread()
|
||||
.build()
|
||||
.unwrap()
|
||||
.block_on(async move {
|
||||
let mut writer = prepare_db_writer(rp).await;
|
||||
|
||||
let items_iter = gen_data(N).collect::<Vec<TestData>>().into_iter();
|
||||
let mut samples_stream = futures::stream::iter(items_iter);
|
||||
writer.load(&mut samples_stream).await.unwrap();
|
||||
writer.finish().await.unwrap();
|
||||
})
|
||||
})
|
||||
.join()
|
||||
.expect("spawn thread");
|
||||
}
|
||||
|
||||
fn setup_writer<P: AsRef<Path>>(path: P) -> Writer<TestData> {
|
||||
let rp = path.as_ref().to_str().unwrap().to_string();
|
||||
|
||||
std::thread::spawn(|| {
|
||||
runtime::Builder::new_current_thread()
|
||||
.build()
|
||||
.unwrap()
|
||||
.block_on(prepare_db_writer(rp))
|
||||
})
|
||||
.join()
|
||||
.expect("spawn thread")
|
||||
}
|
||||
|
||||
fn setup_reader<P: AsRef<Path>>(path: P) -> Reader<TestData> {
|
||||
let rp = path.as_ref().to_str().unwrap().to_string();
|
||||
std::thread::spawn(|| {
|
||||
runtime::Builder::new_current_thread()
|
||||
.build()
|
||||
.unwrap()
|
||||
.block_on(async move { Reader::new(rp).await.expect("new reader") })
|
||||
})
|
||||
.join()
|
||||
.expect("spawn thread")
|
||||
}
|
||||
|
||||
fn async_read(c: &mut Criterion) {
|
||||
let dir = tempdir().expect("tempdir");
|
||||
let tmpfile = NamedTempFile::new_in(dir.path())
|
||||
.expect("new tempfile")
|
||||
.into_temp_path();
|
||||
write_sample(&tmpfile);
|
||||
|
||||
c.bench_function("async_read", |b| {
|
||||
b.to_async(RUNTIME.deref()).iter_batched(
|
||||
|| setup_reader(&tmpfile),
|
||||
|reader| async move { reader.stream().for_each(|item| async { drop(item) }).await },
|
||||
BatchSize::SmallInput,
|
||||
)
|
||||
});
|
||||
}
|
||||
|
||||
fn async_write(c: &mut Criterion) {
|
||||
let dir = tempdir().expect("tempdir");
|
||||
|
||||
c.bench_function("async_write", |b| {
|
||||
b.to_async(RUNTIME.deref()).iter_batched(
|
||||
|| {
|
||||
let tmpfile = NamedTempFile::new_in(dir.path())
|
||||
.expect("new tempfile")
|
||||
.into_temp_path();
|
||||
let src = gen_data(N).collect::<Vec<TestData>>().into_iter();
|
||||
let src = futures::stream::iter(src);
|
||||
let writer = setup_writer(&tmpfile);
|
||||
(src, writer)
|
||||
},
|
||||
|(mut src, mut writer)| async move {
|
||||
writer.load(&mut src).await.unwrap();
|
||||
writer.finish().await.unwrap();
|
||||
},
|
||||
BatchSize::SmallInput,
|
||||
)
|
||||
});
|
||||
}
|
||||
|
||||
fn config() -> Criterion {
|
||||
Criterion::default().sample_size(20)
|
||||
}
|
||||
|
||||
criterion_group! {name=benches; config = config(); targets = async_read, async_write}
|
||||
criterion_main!(benches);
|
Loading…
Reference in New Issue
Block a user