Skip to content

Commit 9d2ec74

Browse files
committed
Add some simple benchmarks
1 parent 2a8f7bd commit 9d2ec74

File tree

5 files changed

+72
-6
lines changed

5 files changed

+72
-6
lines changed

tokio-postgres/Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ categories = ["database"]
1313
[lib]
1414
test = false
1515

16+
[[bench]]
17+
name = "bench"
18+
harness = false
19+
1620
[package.metadata.docs.rs]
1721
all-features = true
1822

@@ -47,6 +51,7 @@ tokio = { version = "=0.2.0-alpha.6", default-features = false, features = ["io"
4751
[dev-dependencies]
4852
tokio = "=0.2.0-alpha.6"
4953
env_logger = "0.5"
54+
criterion = "0.3"
5055

5156
bit-vec-06 = { version = "0.6", package = "bit-vec" }
5257
chrono-04 = { version = "0.4", package = "chrono" }

tokio-postgres/benches/bench.rs

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use futures::channel::oneshot;
3+
use futures::executor;
4+
use std::sync::Arc;
5+
use std::time::Instant;
6+
use tokio::runtime::Runtime;
7+
use tokio_postgres::{Client, NoTls};
8+
9+
fn setup() -> (Client, Runtime) {
10+
let runtime = Runtime::new().unwrap();
11+
let (client, conn) = runtime
12+
.block_on(tokio_postgres::connect(
13+
"host=localhost port=5433 user=postgres",
14+
NoTls,
15+
))
16+
.unwrap();
17+
runtime.spawn(async { conn.await.unwrap() });
18+
(client, runtime)
19+
}
20+
21+
fn query_prepared(c: &mut Criterion) {
22+
let (client, runtime) = setup();
23+
let statement = runtime.block_on(client.prepare("SELECT $1::INT8")).unwrap();
24+
c.bench_function("runtime_block_on", move |b| {
25+
b.iter(|| {
26+
runtime
27+
.block_on(client.query(&statement, &[&1i64]))
28+
.unwrap()
29+
})
30+
});
31+
32+
let (client, runtime) = setup();
33+
let statement = runtime.block_on(client.prepare("SELECT $1::INT8")).unwrap();
34+
c.bench_function("executor_block_on", move |b| {
35+
b.iter(|| {
36+
executor::block_on(client.query(&statement, &[&1i64])).unwrap()
37+
})
38+
});
39+
40+
let (client, runtime) = setup();
41+
let client = Arc::new(client);
42+
let statement = runtime.block_on(client.prepare("SELECT $1::INT8")).unwrap();
43+
c.bench_function("spawned", move |b| {
44+
b.iter_custom(|iters| {
45+
let (tx, rx) = oneshot::channel();
46+
let client = client.clone();
47+
let statement = statement.clone();
48+
runtime.spawn(async move {
49+
let start = Instant::now();
50+
for _ in 0..iters {
51+
client.query(&statement, &[&1i64]).await.unwrap();
52+
}
53+
tx.send(start.elapsed()).unwrap();
54+
});
55+
executor::block_on(rx).unwrap()
56+
})
57+
});
58+
}
59+
60+
criterion_group!(benches, query_prepared);
61+
criterion_main!(benches);

tokio-postgres/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ pub use crate::connection::Connection;
110110
use crate::error::DbError;
111111
pub use crate::error::Error;
112112
pub use crate::portal::Portal;
113+
pub use crate::query::RowStream;
113114
pub use crate::row::{Row, SimpleQueryRow};
115+
pub use crate::simple_query::SimpleQueryStream;
114116
#[cfg(feature = "runtime")]
115117
pub use crate::socket::Socket;
116118
pub use crate::statement::{Column, Statement};
117-
pub use crate::query::RowStream;
118-
pub use crate::simple_query::SimpleQueryStream;
119119
#[cfg(feature = "runtime")]
120120
use crate::tls::MakeTlsConnect;
121121
pub use crate::tls::NoTls;

tokio-postgres/src/query.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use crate::client::{InnerClient, Responses};
2-
use pin_project::pin_project;
32
use crate::codec::FrontendMessage;
43
use crate::connection::RequestMessages;
54
use crate::types::{IsNull, ToSql};
65
use crate::{Error, Portal, Row, Statement};
76
use bytes::{Bytes, BytesMut};
87
use futures::{ready, Stream};
8+
use pin_project::pin_project;
99
use postgres_protocol::message::backend::Message;
1010
use postgres_protocol::message::frontend;
11+
use std::marker::PhantomPinned;
1112
use std::pin::Pin;
1213
use std::task::{Context, Poll};
13-
use std::marker::PhantomPinned;
1414

1515
pub async fn query<'a, I>(
1616
client: &InnerClient,

tokio-postgres/src/simple_query.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ use crate::{Error, SimpleQueryMessage, SimpleQueryRow};
55
use bytes::Bytes;
66
use fallible_iterator::FallibleIterator;
77
use futures::{ready, Stream};
8+
use pin_project::pin_project;
89
use postgres_protocol::message::backend::Message;
910
use postgres_protocol::message::frontend;
11+
use std::marker::PhantomPinned;
1012
use std::pin::Pin;
1113
use std::sync::Arc;
1214
use std::task::{Context, Poll};
13-
use std::marker::PhantomPinned;
14-
use pin_project::pin_project;
1515

1616
pub async fn simple_query(client: &InnerClient, query: &str) -> Result<SimpleQueryStream, Error> {
1717
let buf = encode(client, query)?;

0 commit comments

Comments
 (0)