rustdb/
bench.rs

1/* Each test should first create a table with two columns, insert 8,192 identical rows 'Alice', 1000.
2   Then (the timed part) should total the second column ( result 8,192,000 ) and do this 1,000 times.
3*/
4
5#[test]
6fn sqlite_test() {
7    let connection = sqlite::open(":memory:").unwrap();
8
9    let sql = "
10    CREATE TABLE users (Id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
11    INSERT INTO users(name,age) VALUES ('Alice', 1000);";
12    connection.execute(sql).unwrap();
13
14    let sql = "INSERT INTO users(name,age) SELECT name, age FROM users";
15
16    // Create 8192 records (each iteration should double number of records)
17    for _i in 0..13 {
18        connection.execute(sql).unwrap();
19    }
20
21    let mut results = Vec::new();
22    for _outer in 0..100 {
23        let start = std::time::Instant::now();
24        for _i in 0..10 {
25            let sql = "SELECT SUM(age) FROM users";
26            connection.execute(sql).unwrap();
27        }
28        results.push(start.elapsed().as_micros() as u64);
29    }
30    print_results("sqlite_test", results);
31}
32
33#[test]
34fn rustdb_test() {
35    use crate::*;
36
37    // let stg = AtomicFile::new(MemFile::new(), DummyFile::new());
38    let stg = MemFile::new();
39
40    let mut bmap = BuiltinMap::default();
41    standard_builtins(&mut bmap);
42    let bmap = Arc::new(bmap);
43
44    let spd = SharedPagedData::new(stg);
45    let wapd = AccessPagedData::new_writer(spd.clone());
46    let db = Database::new(wapd, "", bmap.clone());
47
48    let mut tr = GenTransaction::default();
49
50    let sql = "
51    CREATE SCHEMA test GO
52    CREATE TABLE test.users (name string, age int) GO";
53
54    db.run(&sql, &mut tr);
55
56    let sql = "DECLARE @i int SET @i = 8192
57      WHILE @i > 0
58      BEGIN
59        INSERT INTO test.users(name,age) VALUES ('Alice', 1000)
60        SET @i -= 1
61      END";
62
63    db.run(&sql, &mut tr);
64
65    let mut results = Vec::new();
66    for _outer in 0..100 {
67        let start = std::time::Instant::now();
68
69        for _i in 0..10 {
70            let sql =
71                "DECLARE @total int FOR @total += age FROM test.users BEGIN END SELECT ''|@total";
72            let mut tr = GenTransaction::default();
73            db.run(&sql, &mut tr);
74            assert_eq!(tr.rp.output, b"8192000");
75        }
76
77        results.push(start.elapsed().as_micros() as u64);
78    }
79    print_results("rustdb_test", results);
80}
81
82#[test]
83fn rustdb_direct_test() {
84    use crate::*;
85
86    // let stg = AtomicFile::new(MemFile::new(), MemFile::new());
87    let stg = MemFile::new();
88
89    let mut bmap = BuiltinMap::default();
90    standard_builtins(&mut bmap);
91    let bmap = Arc::new(bmap);
92
93    let spd = SharedPagedData::new(stg);
94    let wapd = AccessPagedData::new_writer(spd.clone());
95
96    let db = Database::new(wapd, "", bmap.clone());
97
98    let mut tr = GenTransaction::default();
99
100    let sql = "
101    CREATE SCHEMA test GO
102    CREATE TABLE test.users (name string, age int) GO";
103
104    db.run(&sql, &mut tr);
105
106    let sql = "DECLARE @i int SET @i = 8192
107      WHILE @i > 0
108      BEGIN
109        INSERT INTO test.users(name,age) VALUES ('Alice', 1000)
110        SET @i -= 1
111      END";
112
113    db.run(&sql, &mut tr);
114
115    let mut results = Vec::new();
116    for _outer in 0..100 {
117        let start = std::time::Instant::now();
118        for _i in 0..10 {
119            let ut = db.table("test", "users");
120            assert!(data_kind(ut.info.typ[1]) == DataKind::Int);
121            assert!(data_size(ut.info.typ[1]) == 8);
122            let col_off = ut.info.off[1];
123            let mut total = 0;
124            for (pp, off) in ut.scan(&db) {
125                let p = &pp.borrow();
126                // let a = ut.access(p, off); total += a.int(1);
127                total += util::iget(&p.data, off + col_off, 8);
128            }
129            assert_eq!(total, 8192000);
130        }
131        results.push(start.elapsed().as_micros() as u64);
132    }
133    print_results("rustdb_direct_test", results);
134}
135
136#[cfg(test)]
137pub fn print_results(name: &str, mut results: Vec<u64>) {
138    results.sort();
139    let n = results.len() / 10;
140    let results = &results[0..n];
141    let mut total = 0;
142    for result in results {
143        total += result;
144    }
145    println!(
146        "{} average time={} sorted results={:?}",
147        name,
148        total / (n as u64),
149        results
150    );
151}