writes = {
sqlitedb.exec([
"DROP TABLE IF EXISTS keyval;",
"CREATE TABLE keyval (k PRIMARY KEY, v);",
"VACUUM;"
]);
const stmt = sqlitedb.prepare("INSERT OR REPLACE INTO keyval VALUES (?, ?)");
const trials = [1, 10, 100, 1_000, 10_000, 100_000];
const idbNoTx = [];
const idbTx = [];
const idbPaged = [];
const idbPagedPTreap = [];
const sqliteMem = [];
let a = 0;
const comp = (l, r) => l.a - r.a;
for (const numItems of trials) {
if (numItems < 10_000) {
idbNoTx.push({
size: numItems,
time: await bench(async () => {
if (numItems >= 10_000) {
return 0;
}
for (let i = 0; i < numItems; ++i) {
const tx = kvstore.transaction("keyval", "readwrite", {
durability: "relaxed"
});
await tx.store.put({ a: ++a }, makeKey("idbNoTx", numItems, i));
await tx.done;
}
})
});
}
if (numItems < 10_000) {
idbTx.push({
size: numItems,
time: await bench(async () => {
const tx = kvstore.transaction("keyval", "readwrite", {
durability: "relaxed"
});
const promises = [];
for (let i = 0; i < numItems; ++i) {
promises.push(
tx.store.put({ a: ++a }, makeKey("idbTx", numItems, i))
);
}
promises.push(tx.done);
await Promise.all(promises);
})
});
}
idbPaged.push({
size: numItems,
time: await bench(async () => {
const page = [];
for (let i = 0; i < numItems; ++i) {
page.push({ a: ++a });
}
const tx = kvstore.transaction("keyval", "readwrite", {
durability: "relaxed"
});
await tx.store.put(page, makeKey("paged", numItems));
await tx.done;
})
});
idbPagedPTreap.push({
size: numItems,
time: await bench(async () => {
let page = new PersistentTreap(comp);
for (let i = 0; i < numItems; ++i) {
page = page.add({ a: ++a });
}
const tx = kvstore.transaction("keyval", "readwrite", {
durability: "relaxed"
});
await tx.store.put(page._root, makeKey("ppTreap", numItems));
await tx.done;
})
});
sqliteMem.push({
size: numItems,
time: await bench(() => {
sqlitedb.transaction(() => {
for (let i = 0; i < numItems; ++i) {
stmt.bind(1, makeKey("sqlite", numItems, i));
stmt.bind(2, ++a).stepReset();
}
});
})
});
}
return {
idbNoTx,
idbTx,
idbPaged,
idbPagedPTreap,
sqliteMem
};
}