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();