diff --git a/Cargo.lock b/Cargo.lock index 63fd1dfd9..c9d606928 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -833,11 +833,13 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10" dependencies = [ + "async-std", "atty", "cast", "clap", "criterion-plot", "csv", + "futures", "itertools", "lazy_static", "num-traits", diff --git a/Cargo.toml b/Cargo.toml index 187077141..c9f261426 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -80,7 +80,7 @@ zip = { version = "0.5.13", default-features = false, features = ["deflate"] } [dev-dependencies] ansi_term = "0.12.0" async-std = { version = "1", features = ["unstable", "attributes"] } -criterion = "0.3" +criterion = { version = "0.3.4", features = ["async_std"] } futures-lite = "1.12" log = "0.4" pretty_env_logger = "0.4" @@ -116,6 +116,10 @@ harness = false name = "search_msgs" harness = false +[[bench]] +name = "receive_emails" +harness = false + [features] default = ["vendored"] internals = [] diff --git a/benches/receive_emails.rs b/benches/receive_emails.rs new file mode 100644 index 000000000..487fcd61a --- /dev/null +++ b/benches/receive_emails.rs @@ -0,0 +1,84 @@ +use async_std::{path::PathBuf, task::block_on}; +use criterion::{ + async_executor::AsyncStdExecutor, black_box, criterion_group, criterion_main, BatchSize, + Criterion, +}; +use deltachat::{ + config::Config, + context::Context, + dc_receive_imf::dc_receive_imf, + imex::{imex, ImexMode}, +}; +use tempfile::tempdir; + +async fn recv_all_emails(context: Context) -> Context { + for i in 0..100 { + let imf_raw = format!( + "Subject: Benchmark +Message-ID: Mr.OssSYnOFkhR.{i}@testrun.org +Date: Sat, 07 Dec 2019 19:00:27 +0000 +To: alice@example.com +From: sender@testrun.org +Chat-Version: 1.0 +Chat-Disposition-Notification-To: sender@testrun.org +Chat-User-Avatar: 0 +In-Reply-To: Mr.OssSYnOFkhR.{i_dec}@testrun.org +MIME-Version: 1.0 + +Content-Type: text/plain; charset=utf-8; format=flowed; delsp=no + +Hello {i}", + i = i, + i_dec = i - 1, + ); + dc_receive_imf(&context, black_box(imf_raw.as_bytes()), "INBOX", false) + .await + .unwrap(); + } + context +} + +async fn create_context() -> Context { + let dir = tempdir().unwrap(); + let dbfile = dir.path().join("db.sqlite"); + let id = 100; + let context = Context::new(dbfile.into(), id).await.unwrap(); + + let backup: PathBuf = std::env::current_dir() + .unwrap() + .join("delta-chat-backup.tar") + .into(); + if backup.exists().await { + println!("Importing backup"); + imex(&context, ImexMode::ImportBackup, &backup, None) + .await + .unwrap(); + } + + let addr = "alice@example.com"; + context.set_config(Config::Addr, Some(addr)).await.unwrap(); + context + .set_config(Config::ConfiguredAddr, Some(addr)) + .await + .unwrap(); + context + .set_config(Config::Configured, Some("1")) + .await + .unwrap(); + context +} + +fn criterion_benchmark(c: &mut Criterion) { + let mut group = c.benchmark_group("Receive messages"); + group.bench_function("Receive 100 simple text msgs", |b| { + b.to_async(AsyncStdExecutor).iter_batched( + || block_on(create_context()), + |context| recv_all_emails(black_box(context)), + BatchSize::LargeInput, + ); + }); + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches);