From 16f9743a75ebc4ab13847d0b01e72fd8025a2fbc Mon Sep 17 00:00:00 2001 From: Joseph Birr-Pixton Date: Mon, 22 Apr 2019 12:10:32 +0100 Subject: [PATCH] Benchmark for read_tls with polled nbio --- Cargo.toml | 6 ++++++ tests/benchmarks.rs | 26 ++++++++++++++++++++++++++ tests/common/mod.rs | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tests/benchmarks.rs diff --git a/Cargo.toml b/Cargo.toml index c54ff02b..b7ebf8b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ env_logger = "0.6.1" log = "0.4.0" tempfile = "3.0" webpki-roots = "0.16" +criterion = "0.2" [[example]] name = "bogo_shim" @@ -42,3 +43,8 @@ path = "examples/internal/trytls_shim.rs" [[example]] name = "bench" path = "examples/internal/bench.rs" + +[[bench]] +name = "benchmarks" +path = "tests/benchmarks.rs" +harness = false diff --git a/tests/benchmarks.rs b/tests/benchmarks.rs new file mode 100644 index 00000000..a9742bda --- /dev/null +++ b/tests/benchmarks.rs @@ -0,0 +1,26 @@ +/// Microbenchmarks go here. Larger benchmarks of (eg.) protocol +/// performance go in examples/internal/bench.rs. + +use criterion::Criterion; +use criterion::criterion_group; +use criterion::criterion_main; + +#[allow(dead_code)] +mod common; +use crate::common::*; + +use rustls::{Session, ServerSession}; + +use std::sync::Arc; +use std::io; + +fn bench_ewouldblock(c: &mut Criterion) { + let server_config = make_server_config(KeyType::RSA); + let mut server = ServerSession::new(&Arc::new(server_config)); + let mut read_ewouldblock = FailsReads::new(io::ErrorKind::WouldBlock); + c.bench_function("read_tls with EWOULDBLOCK", + move |b| b.iter(|| server.read_tls(&mut read_ewouldblock))); +} + +criterion_group!(benches, bench_ewouldblock); +criterion_main!(benches); diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 14c0a027..6cf65b26 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -274,3 +274,19 @@ pub fn do_handshake_until_error(client: &mut ClientSession, pub fn dns_name(name: &'static str) -> webpki::DNSNameRef<'_> { webpki::DNSNameRef::try_from_ascii_str(name).unwrap() } + +pub struct FailsReads { + errkind: io::ErrorKind +} + +impl FailsReads { + pub fn new(errkind: io::ErrorKind) -> FailsReads { + FailsReads { errkind } + } +} + +impl io::Read for FailsReads { + fn read(&mut self, _b: &mut [u8]) -> io::Result { + Err(io::Error::from(self.errkind)) + } +}