-
-
Notifications
You must be signed in to change notification settings - Fork 847
Expand file tree
/
Copy pathinsert.js
More file actions
160 lines (139 loc) · 5.25 KB
/
insert.js
File metadata and controls
160 lines (139 loc) · 5.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
const sqlite3 = require('../../lib/sqlite3');
const fs = require('fs');
const iterations = 10000;
/**
* Helper to promisify sqlite3 operations
*/
function promisifyRun(db, sql, params = []) {
return new Promise((resolve, reject) => {
db.run(sql, params, function (err) {
if (err) reject(err);
else resolve(this);
});
});
}
function promisifyExec(db, sql) {
return new Promise((resolve, reject) => {
db.exec(sql, (err) => {
if (err) reject(err);
else resolve();
});
});
}
function promisifyClose(db) {
return new Promise((resolve, reject) => {
db.close((err) => {
if (err) reject(err);
else resolve();
});
});
}
/**
* Insert benchmarks with proper setup/teardown separation.
* Setup (create database, create table) and teardown (close database)
* are NOT measured - only the actual insert operations are measured.
*/
module.exports = {
benchmarks: {
'literal file': {
async beforeEach() {
// Setup: Create in-memory database - NOT measured
this.db = new sqlite3.Database(':memory:');
this.sqlFile = fs.readFileSync(__dirname + '/insert-transaction.sql', 'utf8');
},
async fn() {
// Benchmark: Execute SQL file - MEASURED
await promisifyExec(this.db, this.sqlFile);
},
async afterEach() {
// Teardown: Close database - NOT measured
await promisifyClose(this.db);
},
},
'transaction with two statements': {
async beforeEach() {
// Setup: Create database and table - NOT measured
this.db = new sqlite3.Database(':memory:');
await promisifyRun(this.db, 'CREATE TABLE foo (id INT, txt TEXT)');
},
async fn() {
// Benchmark: Insert with transaction and two parallel statements - MEASURED
const db = this.db;
await new Promise((resolve, reject) => {
db.serialize(async () => {
await promisifyRun(db, 'BEGIN');
db.parallelize(() => {
const stmt1 = db.prepare('INSERT INTO foo VALUES (?, ?)');
const stmt2 = db.prepare('INSERT INTO foo VALUES (?, ?)');
for (let i = 0; i < iterations; i++) {
stmt1.run(i, 'Row ' + i);
i++;
stmt2.run(i, 'Row ' + i);
}
stmt1.finalize();
stmt2.finalize();
});
await promisifyRun(db, 'COMMIT');
resolve();
});
});
},
async afterEach() {
// Teardown: Close database - NOT measured
await promisifyClose(this.db);
},
},
'with transaction': {
async beforeEach() {
// Setup: Create database and table - NOT measured
this.db = new sqlite3.Database(':memory:');
await promisifyRun(this.db, 'CREATE TABLE foo (id INT, txt TEXT)');
},
async fn() {
// Benchmark: Insert with transaction - MEASURED
const db = this.db;
await new Promise((resolve, reject) => {
db.serialize(async () => {
await promisifyRun(db, 'BEGIN');
const stmt = db.prepare('INSERT INTO foo VALUES (?, ?)');
for (let i = 0; i < iterations; i++) {
stmt.run(i, 'Row ' + i);
}
stmt.finalize();
await promisifyRun(db, 'COMMIT');
resolve();
});
});
},
async afterEach() {
// Teardown: Close database - NOT measured
await promisifyClose(this.db);
},
},
'without transaction': {
async beforeEach() {
// Setup: Create database and table - NOT measured
this.db = new sqlite3.Database(':memory:');
await promisifyRun(this.db, 'CREATE TABLE foo (id INT, txt TEXT)');
},
async fn() {
// Benchmark: Insert without transaction - MEASURED
const db = this.db;
await new Promise((resolve, reject) => {
db.serialize(() => {
const stmt = db.prepare('INSERT INTO foo VALUES (?, ?)');
for (let i = 0; i < iterations; i++) {
stmt.run(i, 'Row ' + i);
}
stmt.finalize();
resolve();
});
});
},
async afterEach() {
// Teardown: Close database - NOT measured
await promisifyClose(this.db);
},
},
},
};