From f2e6ac7e032f3f897f2c9e9af2a2776de3f3c660 Mon Sep 17 00:00:00 2001 From: Ivan Ukhov Date: Tue, 4 Aug 2015 08:21:22 -0400 Subject: [PATCH] Add benchmarks for Statement and Cursor --- benches/lib.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/lib.rs | 2 +- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 benches/lib.rs diff --git a/benches/lib.rs b/benches/lib.rs new file mode 100644 index 0000000..27d6a63 --- /dev/null +++ b/benches/lib.rs @@ -0,0 +1,89 @@ +#![feature(test)] + +extern crate sqlite; +extern crate test; + +use sqlite::{Connection, State, Value}; +use test::Bencher; + +#[bench] +fn read_cursor(bencher: &mut Bencher) { + let connection = create(); + populate(&connection, 100); + let mut cursor = connection.prepare(" + SELECT * FROM data WHERE integer > ? AND real > ? + ").unwrap().cursor(); + + bencher.iter(|| { + cursor.bind(&[Value::Integer(42), Value::Float(69.0)]).unwrap(); + while let Some(row) = cursor.next().unwrap() { + assert!(row[0].as_integer().unwrap() > 42); + assert!(row[1].as_float().unwrap() > 69.0); + } + }) +} + +#[bench] +fn read_statement(bencher: &mut Bencher) { + let connection = create(); + populate(&connection, 100); + let mut statement = connection.prepare(" + SELECT * FROM data WHERE integer > ? AND real > ? + ").unwrap(); + + bencher.iter(|| { + statement.reset().unwrap(); + statement.bind(1, 42).unwrap(); + statement.bind(2, 69.0).unwrap(); + while let State::Row = statement.next().unwrap() { + assert!(statement.read::(0).unwrap() > 42); + assert!(statement.read::(1).unwrap() > 69.0); + } + }) +} + +#[bench] +fn write_cursor(bencher: &mut Bencher) { + let connection = create(); + let mut cursor = connection.prepare(" + INSERT INTO data (integer, real) VALUES (?, ?) + ").unwrap().cursor(); + + bencher.iter(|| { + cursor.bind(&[Value::Integer(42), Value::Float(69.0)]).unwrap(); + cursor.next().unwrap(); + }) +} + +#[bench] +fn write_statement(bencher: &mut Bencher) { + let connection = create(); + let mut statement = connection.prepare(" + INSERT INTO data (integer, real) VALUES (?, ?) + ").unwrap(); + + bencher.iter(|| { + statement.reset().unwrap(); + statement.bind(1, 42).unwrap(); + statement.bind(2, 69.0).unwrap(); + assert_eq!(statement.next().unwrap(), State::Done); + }) +} + +fn create() -> Connection { + let connection = Connection::open(":memory:").unwrap(); + connection.execute("CREATE TABLE data (integer INTEGER, real REAL)").unwrap(); + connection +} + +fn populate(connection: &Connection, count: usize) { + let mut statement = connection.prepare(" + INSERT INTO data (integer, real) VALUES (?, ?) + ").unwrap(); + for i in 0..count { + statement.reset().unwrap(); + statement.bind(1, i as i64).unwrap(); + statement.bind(2, i as f64).unwrap(); + assert_eq!(statement.next().unwrap(), State::Done); + } +} diff --git a/tests/lib.rs b/tests/lib.rs index 4d1f007..12e2408 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -70,7 +70,7 @@ fn connection_set_busy_handler() { } #[test] -fn cursor() { +fn cursor_workflow() { let connection = setup(":memory:"); let statement = "SELECT id, name FROM users WHERE id = ?"; let mut cursor = ok!(connection.prepare(statement)).cursor();