YCSB benchmarks

Everyday reads and writes: the six core workloads of YCSB against SQLite, PostgreSQL, MongoDB and Redis, every cell, and how it was measured.

Everyday reads and writes (YCSB)

fenecdb as a general database: the six core workloads of YCSB, the Yahoo! Cloud Serving Benchmark, over a million records of ten 100-character fields — reads of a whole record, updates of one field, inserts, short scans — in process against SQLite, and fenec-server over HTTP against PostgreSQL and MongoDB, and beside Redis. Each figure is the median of three runs: operations a second, and under it the p99 of the workload's slowest operation. fenecdb compacts its file on its own, in process and in the server, as it ships. Every cell is below, the ones fenecdb loses too.

In process: fenecdb against SQLite. Durable, an fsync a write:

durablefenecdb, 1 threadSQLite, 1 threadfenecdb, 16 threadsSQLite, 16 threads
A: 50% read, 50% update0.50 k
p99 4.9 ms
0.47 k
p99 8.1 ms
3.22 k
p99 25.0 ms
0.45 k
p99 2 533 ms
B: 95% read, 5% update4.90 k
p99 4.8 ms
3.68 k
p99 8.1 ms
39.4 k
p99 14.7 ms
3.80 k
p99 1 669 ms
D: 95% read the latest, 5% insert4.97 k
p99 4.6 ms
4.04 k
p99 7.9 ms
44.8 k
p99 13.8 ms
4.07 k
p99 1 653 ms
E: 95% scan, 5% insert2.94 k
p99 4.7 ms
2.81 k
p99 8.0 ms
37.7 k
p99 11.5 ms
3.60 k
p99 1 602 ms
F: 50% read, 50% read-modify-write0.50 k
p99 4.9 ms
0.47 k
p99 7.2 ms
4.05 k
p99 16.1 ms
0.43 k
p99 2 122 ms

Buffered, each engine's default:

bufferedfenecdb, 1 threadSQLite, 1 threadfenecdb, 16 threadsSQLite, 16 threads
A: 50% read, 50% update212 k
p99 0.01 ms
32.1 k
p99 0.16 ms
151 k
p99 0.71 ms
29.4 k
p99 9.9 ms
B: 95% read, 5% update410 k
p99 0.01 ms
78.8 k
p99 0.18 ms
545 k
p99 0.61 ms
47.9 k
p99 38.0 ms
C: 100% read438 k
p99 0.00 ms
279 k
p99 0.01 ms
1841 k
p99 0.01 ms
606 k
p99 0.20 ms
D: 95% read the latest, 5% insert432 k
p99 0.01 ms
183 k
p99 0.14 ms
485 k
p99 0.84 ms
71.4 k
p99 24.2 ms
E: 95% scan, 5% insert19.1 k
p99 0.10 ms
17.4 k
p99 0.63 ms
58.9 k
p99 3.7 ms
16.6 k
p99 10.6 ms
F: 50% read, 50% read-modify-write192 k
p99 0.01 ms
34.6 k
p99 0.18 ms
121 k
p99 0.90 ms
35.5 k
p99 10.4 ms

Over the wire: fenec-server against PostgreSQL and MongoDB. Durable, all three in Docker's virtual machine, which syncs a write in a tenth of a millisecond where the Mac's F_FULLFSYNC takes four; fenec-server on the Mac beside them:

durable, one clientfenec-server, DockerPostgreSQL, DockerMongoDB, Dockerfenec-server on the Mac
A: 50% read, 50% update3.34 k
p99 1.1 ms
2.52 k
p99 1.4 ms
1.97 k
p99 1.7 ms
0.53 k
p99 7.0 ms
B: 95% read, 5% update4.50 k
p99 1.2 ms
3.09 k
p99 5.5 ms
2.48 k
p99 1.8 ms
3.26 k
p99 6.1 ms
D: 95% read the latest, 5% insert4.86 k
p99 1.1 ms
2.77 k
p99 8.2 ms
2.79 k
p99 2.0 ms
3.68 k
p99 5.4 ms
E: 95% scan, 5% insert1.69 k
p99 2.6 ms
1.28 k
p99 3.4 ms
0.84 k
p99 5.1 ms
3.30 k
p99 4.9 ms
F: 50% read, 50% read-modify-write2.36 k
p99 1.7 ms
1.74 k
p99 3.2 ms
1.33 k
p99 2.8 ms
0.49 k
p99 6.4 ms
durable, 16 clientsfenec-server, DockerPostgreSQL, DockerMongoDB, Dockerfenec-server on the Mac
A: 50% read, 50% update13.3 k
p99 5.7 ms
10.5 k
p99 10.7 ms
6.56 k
p99 15.5 ms
3.94 k
p99 18.2 ms
B: 95% read, 5% update18.2 k
p99 6.0 ms
13.0 k
p99 17.7 ms
11.1 k
p99 12.3 ms
42.1 k
p99 10.4 ms
D: 95% read the latest, 5% insert18.0 k
p99 6.2 ms
14.8 k
p99 10.2 ms
12.0 k
p99 11.9 ms
41.8 k
p99 10.4 ms
E: 95% scan, 5% insert2.72 k
p99 25.8 ms
2.21 k
p99 30.5 ms
2.01 k
p99 31.9 ms
40.8 k
p99 9.9 ms
F: 50% read, 50% read-modify-write9.43 k
p99 9.9 ms
7.91 k
p99 12.0 ms
5.00 k
p99 34.3 ms
4.05 k
p99 12.5 ms

Buffered, fenec-server on the Mac against the two in Docker, its network included:

bufferedfenec-server, 1 threadPostgreSQL, 1 threadMongoDB, 1 threadfenec-server, 16 threadsPostgreSQL, 16 threadsMongoDB, 16 threads
A: 50% read, 50% update44.2 k
p99 0.04 ms
2.98 k
p99 1.3 ms
2.20 k
p99 1.5 ms
110 k
p99 0.70 ms
13.7 k
p99 4.9 ms
8.90 k
p99 10.0 ms
A, fenec-server in Docker as well3.06 k
p99 1.4 ms
  16.5 k
p99 3.7 ms
  
B: 95% read, 5% update44.0 k
p99 0.04 ms
2.99 k
p99 1.4 ms
2.22 k
p99 1.6 ms
154 k
p99 0.37 ms
13.7 k
p99 4.8 ms
11.8 k
p99 5.5 ms
B, fenec-server in Docker as well3.08 k
p99 1.4 ms
  17.5 k
p99 3.4 ms
  
C: 100% read44.1 k
p99 0.03 ms
3.14 k
p99 1.3 ms
2.14 k
p99 1.5 ms
155 k
p99 0.24 ms
14.8 k
p99 4.1 ms
12.9 k
p99 4.6 ms
C, fenec-server in Docker as well3.07 k
p99 1.3 ms
  18.4 k
p99 2.9 ms
  
D: 95% read the latest, 5% insert44.0 k
p99 0.04 ms
2.82 k
p99 1.4 ms
2.22 k
p99 1.5 ms
149 k
p99 0.46 ms
14.4 k
p99 4.6 ms
13.2 k
p99 4.6 ms
D, fenec-server in Docker as well3.10 k
p99 1.4 ms
  17.7 k
p99 3.5 ms
  
E: 95% scan, 5% insert17.8 k
p99 0.10 ms
1.26 k
p99 3.4 ms
0.85 k
p99 4.9 ms
55.2 k
p99 2.6 ms
2.07 k
p99 34.3 ms
2.02 k
p99 33.8 ms
E, fenec-server in Docker as well1.49 k
p99 2.8 ms
  2.59 k
p99 27.7 ms
  
F: 50% read, 50% read-modify-write30.1 k
p99 0.06 ms
2.09 k
p99 2.0 ms
1.40 k
p99 2.4 ms
81.3 k
p99 1.1 ms
9.22 k
p99 8.8 ms
6.60 k
p99 14.6 ms
F, fenec-server in Docker as well2.07 k
p99 1.9 ms
  11.2 k
p99 7.3 ms
  
  • Durable writes from many threads share their fsyncs. At 16 threads fenecdb's lock is released before the fsync, so one fsync covers every write that landed meanwhile; SQLite syncs each commit under its write lock and stays at one thread's rate.
  • Durable over the wire is compared inside Docker. On a Mac, PostgreSQL and MongoDB run in Docker's Linux virtual machine, whose fsync took 0.08 to 0.10 ms where the Mac's F_FULLFSYNC took 3.9 ms, so the durable tables put fenec-server in the same machine; the server on the Mac is beside them for what a real flush to the disk costs it.
  • Buffered over the wire is mostly the network. Docker's network costs a request about a quarter of a millisecond: the emptiest request took 0.334 ms to PostgreSQL and 0.342 ms to MongoDB at the median, 0.281 ms to fenec-server in Docker and 0.019 ms to it on the Mac. The rows fenec-server in Docker as well are the like-for-like there: ahead of PostgreSQL at one client in A, B, D and E, behind in C and F by 2% and 1%; ahead in every workload at 4 and 16 clients; and ahead of MongoDB in every cell.

Where fenecdb loses, and why.

  • Nowhere in process. fenecdb is ahead of SQLite in every cell; the closest are C at four threads, 1.43 M against 1.33 M, and E durable at one, 2.94 k against 2.81 k. It lost the buffered reads after the updates until its file compacted on its own (C at one thread 30.1 k against 279 k, now 438 k; below).
  • fenec-server in Docker against PostgreSQL, at one client: buffered C 3.07 k against 3.14 k and F 2.07 k against 2.09 k. A read is a round trip of about 0.29 ms, and taken apart 0.25 ms of it is Docker's port forwarding, the same for both; fenec-server's own part is 0.018 ms, PostgreSQL's bind and execute 0.016, and the answer the same size, 1.3 KB against 1.2 in one packet. The rest moves with the VM rather than with either server, by more than the gap from one day to the next: PostgreSQL's C at one client did 3.66 k on 2026-10-05, 3.14 k here, fenec-server's 3.19 k and 3.07 k. E was the gap that was fenec-server's: a scan of 50 rows spent 213-220 µs inside it, half decoding each row into values and half writing them out, and took 37 page faults, musl giving the answer's memory back to the system and faulting it in again. Written straight from the stored rows into a buffer the connection keeps, it takes 50-60 µs and none: on 2026-10-05 E went 1.03 k -> 1.62 k buffered and 1.06 k -> 1.82 k durable, and here it does 1.49 k against PostgreSQL's 1.26 k buffered, 1.69 k against 1.28 k durable. Durable A and F, where it was behind, are ahead too: an fsync of a file that grew commits ext4's journal, 0.36 ms against 0.065 in place, and a durable write syncs a log of fixed size beside the file instead (A 2.24 k -> 3.27 k on 2026-10-04; here 3.34 k against PostgreSQL's 2.52 k).
  • fenec-server on the Mac, durable A and F: A 0.53 k at one client and 3.94 k at 16, F 0.49 k and 4.05 k. Half the operations are writes, and each waits for F_FULLFSYNC, 3.9 ms on this disk; it is beside the Docker columns, not against them.

Beside Redis

Redis 7.4, the official redis:7 image, in a container of its own in the systems' turns, asked over redis-rs 1.7.1 by a connection a client thread, in the same cells as fenec-server in Docker. It is another kind of system from the rest, and the tables read with that in mind:

  • Everything is in memory. Redis holds the whole data set in its memory and answers from it; nothing is read from disk, and a data set larger than the memory is not an option. fenec-server reads its file through the operating system's page cache, PostgreSQL and MongoDB through their buffers. What each held is the last table below, and what it means for a cache in front of fenec-server is on Instead of Redis.
  • One thread runs the commands. Every command runs on Redis's main thread, one after another, however many clients there are (io-threads is 1 as it comes, and raised it threads the sockets' reading and writing, not the commands). fenec-server reads on a thread a connection under a shared lock and writes under an exclusive one.
  • Its durability is a setting of its own, and each mode is Redis's own terms for it. durable is the append-only file with appendfsync always: the writes are in the file and fsynced before the answers go out, one fsync for the writes of every client that landed meanwhile. buffered is appendfsync everysec, the policy Redis suggests and its default once the file is on: a thread fsyncs once a second, and a crash loses up to a second of answered writes, two if the disk is slow, where fenec-server's --sync 250 loses 250 ms. snapshot is the image as it comes: no append-only file, a snapshot of the data set after 3 600 s and a write, 300 s and 100 writes, or 60 s and 10 000, so a crash loses every write since the last one, minutes of them. Nothing else here is measured that way: it is a column beside the others, not against them. The snapshots stay on in the other two modes, as Redis's persistence page advises both "if you want a degree of data safety comparable to what PostgreSQL can provide you"; each snapshot and each rewrite of the append-only file is a fork, and its copied pages and its writing fall inside the cells.
  • A record is a hash, and a scan needs an index of its own. Each is as YCSB's own Redis binding has it (RedisClient.java): a hash a record, read whole by HGETALL, an update an HSET of its one field, and every key a member of a sorted set, _indices, from which a scan takes its keys (ZRANGEBYSCORE) before it reads their records. Three things differ, each in Redis's favour or neither's: a key's score is the key, where the binding scatters keys by a hash of their text, so a scan reads keys in order from its own as every other system's does; an insert's HSET and ZADD are one MULTI/EXEC, one round trip and one fsync, where the binding sends them apart; and a scan's records come in one pipeline, where the binding asks for them one at a time, so a scan of 50 records is two round trips rather than 51.
  • Both are behind Docker's network, about a quarter of a millisecond a request, most of a read by key: fenec-server in Docker is the like-for-like, and the server on the Mac is not set against Redis in a container.

Durable: fenec-server's --sync always against Redis's appendfsync always, an fsync before each answer, both in Docker's virtual machine:

durablefenec-server, 1 clientRedis, 1 clientfenec-server, 16 clientsRedis, 16 clients
A: 50% read, 50% update3.34 k
p99 1.1 ms
2.03 k
p99 1.8 ms
13.3 k
p99 5.7 ms
8.53 k
p99 6.5 ms
B: 95% read, 5% update4.50 k
p99 1.2 ms
3.51 k
p99 1.8 ms
18.2 k
p99 6.0 ms
9.25 k
p99 8.8 ms
D: 95% read the latest, 5% insert4.86 k
p99 1.1 ms
3.59 k
p99 2.1 ms
18.0 k
p99 6.2 ms
13.0 k
p99 5.5 ms
E: 95% scan, 5% insert1.69 k
p99 2.6 ms
0.65 k
p99 6.1 ms
2.72 k
p99 25.8 ms
0.93 k
p99 64.2 ms
F: 50% read, 50% read-modify-write2.36 k
p99 1.7 ms
1.60 k
p99 2.4 ms
9.43 k
p99 9.9 ms
4.93 k
p99 16.2 ms

Buffered, both in Docker as well: --sync 250 against appendfsync everysec, and beside them Redis with its snapshots alone, which nothing here is measured against:

bufferedfenec-server, 1 clientRedis, 1 clientRedis, snapshots, 1 clientfenec-server, 16 clientsRedis, 16 clientsRedis, snapshots, 16 clients
A: 50% read, 50% update3.06 k
p99 1.4 ms
2.74 k
p99 1.5 ms
2.80 k
p99 1.4 ms
16.5 k
p99 3.7 ms
8.35 k
p99 7.2 ms
8.60 k
p99 7.3 ms
B: 95% read, 5% update3.08 k
p99 1.4 ms
2.75 k
p99 1.5 ms
2.76 k
p99 1.5 ms
17.5 k
p99 3.4 ms
13.5 k
p99 4.2 ms
14.4 k
p99 3.8 ms
C: 100% read3.07 k
p99 1.3 ms
2.73 k
p99 1.5 ms
 18.4 k
p99 2.9 ms
14.0 k
p99 4.0 ms
 
D: 95% read the latest, 5% insert3.10 k
p99 1.4 ms
2.85 k
p99 1.5 ms
2.71 k
p99 1.6 ms
17.7 k
p99 3.5 ms
15.2 k
p99 3.6 ms
15.5 k
p99 3.3 ms
E: 95% scan, 5% insert1.49 k
p99 2.8 ms
0.62 k
p99 6.2 ms
0.62 k
p99 6.5 ms
2.59 k
p99 27.7 ms
1.04 k
p99 59.5 ms
1.04 k
p99 62.1 ms
F: 50% read, 50% read-modify-write2.07 k
p99 1.9 ms
1.52 k
p99 2.3 ms
1.87 k
p99 2.0 ms
11.2 k
p99 7.3 ms
5.53 k
p99 14.6 ms
9.20 k
p99 7.8 ms

Where fenec-server loses to Redis. Every cell in which Redis does more operations a second than fenec-server in Docker, the same mode against the same mode, at 1, 4 and 16 clients:

None of the 33 cells measured both ways.

What each holds. On disk and in memory after A, B, C, F and D: the memory is the container's own, its processes' anonymous memory and shared memory from its cgroup, the page cache of its files apart, and Redis's is read with no snapshot or rewrite running. fenec-server's file is in the page cache, not in this column, as PostgreSQL's and MongoDB's files beyond their buffers are; Redis's data set is in it whole.

after A to Fdurable, on diskdurable, in memorybuffered, on diskbuffered, in memorysnapshot, on disksnapshot, in memory
fenec-server in Docker1 881 MB43 MB1 947 MB43 MB  
Redis2 346 MB1 874 MB2 365 MB1 865 MB2 238 MB1 890 MB
PostgreSQL1 382 MB1 133 MB1 392 MB1 134 MB  
MongoDB2 248 MB1 398 MB2 337 MB1 504 MB  

--verify held every Redis answer to what was written, in the three modes (crates/fenec-bench/ycsb/verify.tsv, run rv), and the runs are crates/fenec-bench/ycsb/run-redis.sh.

Method, and what changed between runs

YCSB's core workloads, written in the bench crate (crates/fenec-bench/src/bin/ycsb.rs) to YCSB's own definitions rather than run through its Java client: a record is a key and ten fields of 100 random characters, a read reads the whole record, an update writes one field, keys are drawn by YCSB's scrambled zipfian (0.99, hashed over ten billion items) or, for D, its skewed-latest, and a scan reads 1 to 100 records from a key. The key is an integer from 1 (insertorder=ordered without the user prefix), so each system keys by what it keys best by: fenecdb's id, SQLite's INTEGER PRIMARY KEY, a bigint primary key, MongoDB's _id; E's scan is get usertable where id >= $1 limit n, which walks the id index from the key. A read never asks for a key whose insert has not been answered. The sequence is YCSB's: a load, then A, B, C, F and D over that data, then a load afresh for E, at 1, 4 and 16 threads, each cell 30 s after a 5 s warm-up. Latencies go into a log-linear histogram of 64 steps an octave.

The systems. fenecdb 0.1.9 in process, reads under the shared lock and writes under the exclusive one as the server takes them, against SQLite 3.53.2 through rusqlite, a connection a thread, WAL, the file mapped. fenec-server natively, each client thread a kept-alive HTTP connection sending POST /query with parameters, against PostgreSQL 17 (shared_buffers 1 GB, prepared statements) and MongoDB 8 (the official Rust driver), each in a container started for its turn and removed with its volume after, so the virtual machine (8 cores, 3.8 GB) holds one at a time. fenec-server in Docker is the same server in a container of its own image. Durable is an fsync a write in each engine's own terms: a flush and its fsync (F_FULLFSYNC on macOS) and --sync always, synchronous=FULL with fullfsync, synchronous_commit=on, j: true; buffered is each one's default: a flush every 250 ms (--sync 250), synchronous=NORMAL, synchronous_commit=off, w: 1, j: false. C writes nothing and runs once, buffered. Docker's fsync is the Linux VM's, which does not flush the Mac's disk as F_FULLFSYNC does: a 1 KB append and its F_FULLFSYNC took 3.9 ms on the Mac and its plain fsync 0.023 ms, while in the VM, on a volume as the databases' data, pg_test_fsync gave 0.076 ms for fdatasync and 0.103 for fsync (crates/fenec-bench/ycsb/fsync.txt). So the server is measured in Docker as well, at 1, 4 and 16 threads, durable and buffered, beside it on the Mac.

Why fenecdb's reads slowed down after the updates, and no longer do. An update writes the whole record again at the file's end, and the version it replaces stays dead until a compact. The first three runs (r1-r3) were measured before anything compacted on its own: after A's and B's updates the buffered file had grown to 4.7 to 6.5 GB on this 8 GB machine, against SQLite's 2.1 to 2.5 GB updated in place, and a profile of C at one thread (crates/fenec-bench/ycsb/profile-c1.txt) put 86% of the reading thread's time on the first byte of the record in the mapped file, waiting for its page: about one read in five went to the disk. C at one thread read 30.1 k a second, where the same cell over a file just loaded read 443 k. fenecdb now compacts a file beside its queries once half of it is dead (Compaction), in an app's process as in the server, and the harness runs it as an app would get it: the in-process database with the engine's Compactor, the server with its default --auto-compact. Runs c1-c3 measured fenecdb and fenec-server again with it; the buffered file stood at 3.7 to 4.0 GB after D, mid-way between compacts of a file A's updates grow by 100 MB a second, and C at one thread read 438 k. The earlier runs of fenecdb and fenec-server stay in the results, marked superseded (crates/fenec-bench/ycsb/superseded.tsv); SQLite was not measured again, and the servers were measured again since, all of them on one day (below).

And once the file nears what the page cache can hold. Since these runs a file is also compacted as it nears the memory the system has for its pages, or once the process waits for the disk (Compaction); the cells above predate it. Measured apart on 2026-10-11 and 12, in process, buffered, A, B and F at 1 and 16 threads, the build before it and the one with it in turns, its cells in none of the medians: with the machine's memory as it stood, two runs each, A at 16 threads went from 82 and 92 k to 133 k twice and the rest stayed within the runs' spread; beside 1 GB of memory held by another program, one run each, B went from 23.5 k to 63.5 k at one thread and from 62.3 k to 112.8 k at 16, F from 23.6 k to 48.5 k at 16, the file at its largest 1.2 to 1.5 GB against 1.5 to 2.0, and A at one thread from 29.7 k to 24.1 k.

The one-client server cells, measured again the same day. On 2026-10-04 fenec-server natively and in Docker (A to F at one thread, durable and buffered, A and C at 16) and PostgreSQL beside them, in turns with three idle minutes between, three times, after the sync log and the rendering changes of the round trip: each cell measured again counts as its run's last line, under the runs' ids, c1-c3 for the servers and r1-r3 for PostgreSQL, so every cell compared at one client is of one day. Comparing them against PostgreSQL's cells of days before had put the servers behind where Docker's network had been quicker then: its C at one client was 3.34 k, 3.53 k this time, and 3.00 k in a check in between. The --verify pass over all 84 cells found no mismatch, and nor did a shorter one after the sync log's fixes (crates/fenec-bench/ycsb/verify.tsv, runs c and fix).

Again after the read path's changes. On 2026-10-05, with fenec-server writing a plain get's rows as JSON straight from the stored documents (the round trip), fenec-server natively and in Docker and PostgreSQL beside them measured B, C, D and E at 1 and 16 clients, durable and buffered, in turns, three times, under the same ids: each cell measured again counts as its run's last line, so these replace those cells of the day before, PostgreSQL's too, and A and F stay as they were. The first of the three ran while other work on the machine still held a core, its idle probe taken at a load of five (65.0 ms against 62.5 idle), and its cells came in up to a quarter under the other two, PostgreSQL's as much as the servers'; it was measured again on the quiet machine, and those lines are its cells. A --verify pass over fenecdb, fenec-server and fenec-server in Docker, A to F at 1 and 16 threads, durable and buffered, 8 s a cell, checked 42.1 million reads, 1.8 million scans of 89.2 million rows and 6.1 million writes and found no mismatch (verify.tsv, run gap).

Every server on one day. On the night of 2026-10-13, fenec-server natively and in Docker, PostgreSQL, MongoDB and Redis measured every cell, A to F at 1, 4 and 16 clients, durable and buffered, three times, in turns with three idle minutes between (runs rx1-rx3, 8.5 hours). They replace the cells of the two paragraphs above, the servers' of c1-c3 and PostgreSQL's and MongoDB's of r1-r3, so every cell compared over the wire is of one day; fenecdb's and SQLite's in process stay as they were. A first attempt (rd1-rd3) is in the results and in no median: it read the containers' file sizes beside the cells, a container started for each look ten times a second, and the VM's work took fenec-server in Docker's C at one client over 100 000 records from 3.14-3.17 k to 2.33-2.38 k, in turns. A size read through a container is read once the clients stop now.

The machine. A fanless M1 MacBook Air, 8 GB, macOS, which slows to a third under minutes of load on every core: each cell starts once a one-core probe runs within 4% of its idle time, the probe's ratio written beside the cell, and the systems take turns with three idle minutes between them.

make ycsb YCSB_ARGS="--runs 3 --out ycsb.tsv"
./target/release/ycsb report ycsb.tsv

The answers are checked. --verify logs every operation and what it was answered, and after each cell holds each one to what was written: a read must answer the record it asked for, each field holding the value of a write that could have been the last one before it (one that ended before the read began and no other ended after it, or one that overlapped the read); a scan must answer consecutive keys from its own, as many as it asked for wherever they existed, each record as written; a write must report one record written. Every write is logged, not a sample, because judging a read under concurrent writes takes every write's span; the log is a push into each thread's own list and the check runs once the cell is over, so nothing is compared in an operation's time. The same check holds every system. A pass over all six — 100 000 records, 10 s a cell, workloads A, E and F at 1 and 16 threads, durable and buffered — checked 13.8 million reads, 2.7 million scans of 134.7 million rows and 9.8 million writes and found no mismatch (crates/fenec-bench/ycsb/verify.tsv); its timings are not published.

Held to YCSB itself. Yahoo's YCSB 0.17.0 — its Java client, the jdbc and mongodb bindings, PostgreSQL's JDBC driver 42.7.4 — and this harness ran the same cells against the same containers: workloads A and C, 1 and 16 threads, 100 000 records, durable, each 30 s (YCSB's maxexecutiontime, which counts its start; the harness warms up 5 s first). Operations a second and the p99 of the slowest operation:

 this harnessYCSB 0.17.0harness against YCSB
PostgreSQL, A, 1 thread2 814, 1.04 ms3 102, 0.93 ms-9%
PostgreSQL, A, 16 threads15 469, 3.10 ms15 173, 3.62 ms+2%
PostgreSQL, C, 1 thread2 701, 1.29 ms2 956, 1.20 ms-9%
PostgreSQL, C, 16 threads18 075, 2.54 ms18 763, 2.77 ms-4%
MongoDB, A, 1 thread2 459, 1.12 ms2 522, 1.16 ms-2%
MongoDB, A, 16 threads10 760, 5.67 ms12 489, 4.64 ms-14%
MongoDB, C, 1 thread2 279, 1.27 ms2 481, 1.30 ms-8%
MongoDB, C, 16 threads15 748, 2.54 ms15 392, 4.18 ms+2%

The harness lands between 14% under and 2% over YCSB's own client, six of the eight cells within 9%; where it differs by more than 2% it measures PostgreSQL and MongoDB a little slower than YCSB does, not faster. The p99s agree to a few tenths of a millisecond but for MongoDB's C at 16 threads, 2.54 ms here against YCSB's 4.18. YCSB keys by strings (user…) where the harness keys by integers, and each side drives its own client library. The outputs and the script are crates/fenec-bench/ycsb/calibration/.

The full grid, every cell at 1, 4 and 16 threads with each operation's p50 and p99, is below; the runs themselves are crates/fenec-bench/ycsb/results.tsv.

Every cell
systemsettingworkloadthreadsops/sp50 / p99 per operation
fenecdbdurableA10.50 kread 0.02 ms / 0.05 ms; update 4.0 ms / 4.9 ms
fenecdbdurableA41.01 kread 0.02 ms / 0.10 ms; update 8.0 ms / 11.1 ms
fenecdbdurableA163.22 kread 0.05 ms / 0.43 ms; update 8.0 ms / 25.0 ms
fenecdbdurableB14.90 kread 0.01 ms / 0.03 ms; update 3.9 ms / 4.8 ms
fenecdbdurableB410.1 kread 0.01 ms / 0.06 ms; update 7.7 ms / 10.8 ms
fenecdbdurableB1639.4 kread 0.01 ms / 0.35 ms; update 7.5 ms / 14.7 ms
fenecdbdurableD14.97 kread 0.01 ms / 0.03 ms; insert 3.9 ms / 4.6 ms
fenecdbdurableD410.1 kread 0.01 ms / 0.05 ms; insert 7.8 ms / 10.8 ms
fenecdbdurableD1644.8 kread 0.01 ms / 0.31 ms; insert 6.5 ms / 13.8 ms
fenecdbdurableE12.94 kinsert 4.0 ms / 4.7 ms; scan 0.14 ms / 0.32 ms
fenecdbdurableE49.75 kinsert 6.8 ms / 10.8 ms; scan 0.08 ms / 0.17 ms
fenecdbdurableE1637.7 kinsert 6.7 ms / 11.5 ms; scan 0.08 ms / 0.42 ms
fenecdbdurableF10.50 kread 0.02 ms / 0.04 ms; rmw 4.0 ms / 4.9 ms
fenecdbdurableF41.01 kread 0.02 ms / 0.09 ms; rmw 8.0 ms / 10.9 ms
fenecdbdurableF164.05 kread 0.03 ms / 0.38 ms; rmw 7.9 ms / 16.1 ms
fenecdbbufferedA1212 kread 0.00 ms / 0.01 ms; update 0.00 ms / 0.01 ms
fenecdbbufferedA4178 kread 0.00 ms / 0.17 ms; update 0.01 ms / 0.33 ms
fenecdbbufferedA16151 kread 0.04 ms / 0.68 ms; update 0.06 ms / 0.71 ms
fenecdbbufferedB1410 kread 0.00 ms / 0.00 ms; update 0.00 ms / 0.01 ms
fenecdbbufferedB4553 kread 0.00 ms / 0.06 ms; update 0.01 ms / 0.21 ms
fenecdbbufferedB16545 kread 0.00 ms / 0.28 ms; update 0.09 ms / 0.61 ms
fenecdbbufferedC1438 kread 0.00 ms / 0.00 ms
fenecdbbufferedC41433 kread 0.00 ms / 0.00 ms
fenecdbbufferedC161841 kread 0.00 ms / 0.01 ms
fenecdbbufferedD1432 kread 0.00 ms / 0.00 ms; insert 0.00 ms / 0.01 ms
fenecdbbufferedD4625 kread 0.00 ms / 0.05 ms; insert 0.01 ms / 0.18 ms
fenecdbbufferedD16485 kread 0.00 ms / 0.35 ms; insert 0.10 ms / 0.84 ms
fenecdbbufferedE119.1 kinsert 0.01 ms / 0.01 ms; scan 0.06 ms / 0.10 ms
fenecdbbufferedE442.3 kinsert 0.19 ms / 1.3 ms; scan 0.07 ms / 0.51 ms
fenecdbbufferedE1658.9 kinsert 0.17 ms / 3.7 ms; scan 0.10 ms / 2.0 ms
fenecdbbufferedF1192 kread 0.00 ms / 0.01 ms; rmw 0.01 ms / 0.01 ms
fenecdbbufferedF4164 kread 0.00 ms / 0.12 ms; rmw 0.01 ms / 0.30 ms
fenecdbbufferedF16121 kread 0.02 ms / 0.56 ms; rmw 0.13 ms / 0.90 ms
SQLitedurableA10.47 kread 0.19 ms / 0.61 ms; update 4.0 ms / 8.1 ms
SQLitedurableA40.47 kread 0.18 ms / 0.63 ms; update 4.0 ms / 20.1 ms
SQLitedurableA160.45 kread 0.20 ms / 0.78 ms; update 4.0 ms / 2 533 ms
SQLitedurableB13.68 kread 0.01 ms / 0.44 ms; update 3.9 ms / 8.1 ms
SQLitedurableB43.82 kread 0.02 ms / 0.57 ms; update 4.0 ms / 388 ms
SQLitedurableB163.80 kread 0.02 ms / 0.62 ms; update 4.2 ms / 1 669 ms
SQLitedurableD14.04 kread 0.01 ms / 0.61 ms; insert 3.9 ms / 7.9 ms
SQLitedurableD44.25 kread 0.01 ms / 0.53 ms; insert 3.9 ms / 367 ms
SQLitedurableD164.07 kread 0.01 ms / 0.53 ms; insert 3.9 ms / 1 653 ms
SQLitedurableE12.81 kinsert 3.9 ms / 8.0 ms; scan 0.08 ms / 1.00 ms
SQLitedurableE43.37 kinsert 4.9 ms / 275 ms; scan 0.08 ms / 1.3 ms
SQLitedurableE163.60 kinsert 7.7 ms / 1 602 ms; scan 0.08 ms / 1.2 ms
SQLitedurableF10.47 kread 0.05 ms / 0.73 ms; rmw 4.0 ms / 7.2 ms
SQLitedurableF40.46 kread 0.19 ms / 1.0 ms; rmw 4.0 ms / 202 ms
SQLitedurableF160.43 kread 0.21 ms / 1.0 ms; rmw 4.0 ms / 2 122 ms
SQLitebufferedA132.1 kread 0.00 ms / 0.15 ms; update 0.01 ms / 0.16 ms
SQLitebufferedA435.7 kread 0.00 ms / 0.43 ms; update 0.01 ms / 1.9 ms
SQLitebufferedA1629.4 kread 0.01 ms / 0.51 ms; update 0.01 ms / 9.9 ms
SQLitebufferedB178.8 kread 0.00 ms / 0.17 ms; update 0.01 ms / 0.18 ms
SQLitebufferedB479.7 kread 0.00 ms / 0.42 ms; update 0.01 ms / 4.1 ms
SQLitebufferedB1647.9 kread 0.04 ms / 1.4 ms; update 0.44 ms / 38.0 ms
SQLitebufferedC1279 kread 0.00 ms / 0.01 ms
SQLitebufferedC41326 kread 0.00 ms / 0.01 ms
SQLitebufferedC16606 kread 0.01 ms / 0.20 ms
SQLitebufferedD1183 kread 0.00 ms / 0.14 ms; insert 0.01 ms / 0.04 ms
SQLitebufferedD4126 kread 0.00 ms / 0.26 ms; insert 0.02 ms / 3.9 ms
SQLitebufferedD1671.4 kread 0.02 ms / 0.99 ms; insert 0.18 ms / 24.2 ms
SQLitebufferedE117.4 kinsert 0.01 ms / 0.04 ms; scan 0.04 ms / 0.63 ms
SQLitebufferedE428.4 kinsert 0.02 ms / 1.5 ms; scan 0.10 ms / 0.62 ms
SQLitebufferedE1616.6 kinsert 0.18 ms / 10.6 ms; scan 0.93 ms / 2.7 ms
SQLitebufferedF134.6 kread 0.00 ms / 0.16 ms; rmw 0.01 ms / 0.18 ms
SQLitebufferedF429.0 kread 0.01 ms / 1.4 ms; rmw 0.01 ms / 4.1 ms
SQLitebufferedF1635.5 kread 0.01 ms / 1.2 ms; rmw 0.01 ms / 10.4 ms
fenec-serverdurableA10.53 kread 0.14 ms / 0.26 ms; update 3.8 ms / 7.0 ms
fenec-serverdurableA41.08 kread 0.19 ms / 0.81 ms; update 7.0 ms / 11.2 ms
fenec-serverdurableA163.94 kread 0.33 ms / 1.3 ms; update 7.5 ms / 18.2 ms
fenec-serverdurableB13.26 kread 0.09 ms / 0.33 ms; update 3.9 ms / 6.1 ms
fenec-serverdurableB410.1 kread 0.07 ms / 0.22 ms; update 6.5 ms / 9.9 ms
fenec-serverdurableB1642.1 kread 0.06 ms / 0.20 ms; update 6.3 ms / 10.4 ms
fenec-serverdurableD13.68 kread 0.08 ms / 0.15 ms; insert 3.9 ms / 5.4 ms
fenec-serverdurableD410.0 kread 0.07 ms / 0.14 ms; insert 6.6 ms / 9.9 ms
fenec-serverdurableD1641.8 kread 0.06 ms / 0.20 ms; insert 6.4 ms / 10.4 ms
fenec-serverdurableE13.30 kinsert 3.5 ms / 4.9 ms; scan 0.13 ms / 0.24 ms
fenec-serverdurableE410.9 kinsert 5.7 ms / 8.7 ms; scan 0.08 ms / 0.18 ms
fenec-serverdurableE1640.8 kinsert 5.9 ms / 9.9 ms; scan 0.08 ms / 0.32 ms
fenec-serverdurableF10.49 kread 0.14 ms / 0.21 ms; rmw 3.9 ms / 6.4 ms
fenec-serverdurableF41.04 kread 0.16 ms / 0.50 ms; rmw 7.5 ms / 11.9 ms
fenec-serverdurableF164.05 kread 0.30 ms / 0.75 ms; rmw 7.7 ms / 12.5 ms
fenec-serverbufferedA144.2 kread 0.02 ms / 0.03 ms; update 0.02 ms / 0.04 ms
fenec-serverbufferedA4107 kread 0.03 ms / 0.09 ms; update 0.03 ms / 0.10 ms
fenec-serverbufferedA16110 kread 0.10 ms / 0.54 ms; update 0.13 ms / 0.70 ms
fenec-serverbufferedB144.0 kread 0.02 ms / 0.03 ms; update 0.03 ms / 0.04 ms
fenec-serverbufferedB4123 kread 0.03 ms / 0.08 ms; update 0.03 ms / 0.09 ms
fenec-serverbufferedB16154 kread 0.09 ms / 0.26 ms; update 0.11 ms / 0.37 ms
fenec-serverbufferedC144.1 kread 0.02 ms / 0.03 ms
fenec-serverbufferedC4123 kread 0.03 ms / 0.08 ms
fenec-serverbufferedC16155 kread 0.10 ms / 0.24 ms
fenec-serverbufferedD144.0 kread 0.02 ms / 0.03 ms; insert 0.03 ms / 0.04 ms
fenec-serverbufferedD4118 kread 0.03 ms / 0.08 ms; insert 0.04 ms / 0.10 ms
fenec-serverbufferedD16149 kread 0.09 ms / 0.35 ms; insert 0.12 ms / 0.46 ms
fenec-serverbufferedE117.8 kinsert 0.03 ms / 0.07 ms; scan 0.06 ms / 0.10 ms
fenec-serverbufferedE447.0 kinsert 0.09 ms / 0.19 ms; scan 0.08 ms / 0.18 ms
fenec-serverbufferedE1655.2 kinsert 0.24 ms / 2.6 ms; scan 0.19 ms / 2.1 ms
fenec-serverbufferedF130.1 kread 0.02 ms / 0.03 ms; rmw 0.05 ms / 0.06 ms
fenec-serverbufferedF472.8 kread 0.03 ms / 0.09 ms; rmw 0.07 ms / 0.15 ms
fenec-serverbufferedF1681.3 kread 0.09 ms / 0.49 ms; rmw 0.23 ms / 1.1 ms
fenec-server in DockerdurableA13.34 kread 0.24 ms / 0.64 ms; update 0.33 ms / 1.1 ms
fenec-server in DockerdurableA47.88 kread 0.32 ms / 1.5 ms; update 0.54 ms / 1.9 ms
fenec-server in DockerdurableA1613.3 kread 0.63 ms / 2.4 ms; update 1.4 ms / 5.7 ms
fenec-server in DockerdurableB14.50 kread 0.20 ms / 0.84 ms; update 0.31 ms / 1.2 ms
fenec-server in DockerdurableB48.21 kread 0.34 ms / 1.7 ms; update 0.53 ms / 2.0 ms
fenec-server in DockerdurableB1618.2 kread 0.68 ms / 2.9 ms; update 1.1 ms / 6.0 ms
fenec-server in DockerdurableD14.86 kread 0.18 ms / 0.76 ms; insert 0.29 ms / 1.1 ms
fenec-server in DockerdurableD48.06 kread 0.34 ms / 1.7 ms; insert 0.55 ms / 2.2 ms
fenec-server in DockerdurableD1618.0 kread 0.69 ms / 3.0 ms; insert 1.2 ms / 6.2 ms
fenec-server in DockerdurableE11.69 kinsert 0.45 ms / 2.5 ms; scan 0.44 ms / 2.6 ms
fenec-server in DockerdurableE42.67 kinsert 1.1 ms / 7.8 ms; scan 1.0 ms / 7.6 ms
fenec-server in DockerdurableE162.72 kinsert 4.0 ms / 21.6 ms; scan 4.2 ms / 25.8 ms
fenec-server in DockerdurableF12.36 kread 0.23 ms / 0.72 ms; rmw 0.56 ms / 1.7 ms
fenec-server in DockerdurableF45.13 kread 0.34 ms / 1.6 ms; rmw 0.92 ms / 2.8 ms
fenec-server in DockerdurableF169.43 kread 0.69 ms / 2.9 ms; rmw 2.2 ms / 9.9 ms
fenec-server in DockerbufferedA13.06 kread 0.29 ms / 1.3 ms; update 0.30 ms / 1.4 ms
fenec-server in DockerbufferedA47.78 kread 0.38 ms / 1.8 ms; update 0.39 ms / 1.8 ms
fenec-server in DockerbufferedA1616.5 kread 0.76 ms / 3.5 ms; update 0.82 ms / 3.7 ms
fenec-server in DockerbufferedB13.08 kread 0.29 ms / 1.4 ms; update 0.30 ms / 1.3 ms
fenec-server in DockerbufferedB48.10 kread 0.37 ms / 1.8 ms; update 0.38 ms / 1.8 ms
fenec-server in DockerbufferedB1617.5 kread 0.72 ms / 3.2 ms; update 0.79 ms / 3.4 ms
fenec-server in DockerbufferedC13.07 kread 0.29 ms / 1.3 ms
fenec-server in DockerbufferedC48.22 kread 0.37 ms / 1.7 ms
fenec-server in DockerbufferedC1618.4 kread 0.69 ms / 2.9 ms
fenec-server in DockerbufferedD13.10 kread 0.29 ms / 1.3 ms; insert 0.32 ms / 1.4 ms
fenec-server in DockerbufferedD47.94 kread 0.37 ms / 1.8 ms; insert 0.39 ms / 1.8 ms
fenec-server in DockerbufferedD1617.7 kread 0.71 ms / 3.1 ms; insert 0.79 ms / 3.5 ms
fenec-server in DockerbufferedE11.49 kinsert 0.35 ms / 1.7 ms; scan 0.53 ms / 2.8 ms
fenec-server in DockerbufferedE42.55 kinsert 0.87 ms / 6.1 ms; scan 1.1 ms / 8.8 ms
fenec-server in DockerbufferedE162.59 kinsert 3.7 ms / 22.2 ms; scan 4.3 ms / 27.7 ms
fenec-server in DockerbufferedF12.07 kread 0.29 ms / 1.3 ms; rmw 0.59 ms / 1.9 ms
fenec-server in DockerbufferedF45.29 kread 0.38 ms / 1.8 ms; rmw 0.78 ms / 2.5 ms
fenec-server in DockerbufferedF1611.2 kread 0.75 ms / 3.6 ms; rmw 1.6 ms / 7.3 ms
PostgreSQLdurableA12.52 kread 0.30 ms / 1.1 ms; update 0.42 ms / 1.4 ms
PostgreSQLdurableA45.97 kread 0.42 ms / 1.7 ms; update 0.72 ms / 3.3 ms
PostgreSQLdurableA1610.5 kread 0.86 ms / 3.2 ms; update 1.7 ms / 10.7 ms
PostgreSQLdurableB13.09 kread 0.28 ms / 1.1 ms; update 0.41 ms / 5.5 ms
PostgreSQLdurableB47.12 kread 0.40 ms / 1.8 ms; update 0.67 ms / 7.0 ms
PostgreSQLdurableB1613.0 kread 0.91 ms / 4.4 ms; update 1.6 ms / 17.7 ms
PostgreSQLdurableD12.77 kread 0.27 ms / 1.3 ms; insert 0.46 ms / 8.2 ms
PostgreSQLdurableD47.07 kread 0.38 ms / 1.8 ms; insert 0.64 ms / 5.9 ms
PostgreSQLdurableD1614.8 kread 0.86 ms / 3.5 ms; insert 1.5 ms / 10.2 ms
PostgreSQLdurableE11.28 kinsert 0.51 ms / 3.2 ms; scan 0.63 ms / 3.4 ms
PostgreSQLdurableE42.04 kinsert 1.3 ms / 10.9 ms; scan 1.5 ms / 10.4 ms
PostgreSQLdurableE162.21 kinsert 4.8 ms / 26.3 ms; scan 5.5 ms / 30.5 ms
PostgreSQLdurableF11.74 kread 0.31 ms / 1.1 ms; rmw 0.70 ms / 3.2 ms
PostgreSQLdurableF44.20 kread 0.42 ms / 1.8 ms; rmw 1.1 ms / 5.5 ms
PostgreSQLdurableF167.91 kread 0.88 ms / 3.5 ms; rmw 2.5 ms / 12.0 ms
PostgreSQLbufferedA12.98 kread 0.30 ms / 1.3 ms; update 0.31 ms / 1.2 ms
PostgreSQLbufferedA47.04 kread 0.42 ms / 1.9 ms; update 0.42 ms / 1.9 ms
PostgreSQLbufferedA1613.7 kread 0.95 ms / 4.8 ms; update 0.96 ms / 4.9 ms
PostgreSQLbufferedB12.99 kread 0.28 ms / 1.4 ms; update 0.29 ms / 1.4 ms
PostgreSQLbufferedB47.16 kread 0.40 ms / 1.9 ms; update 0.41 ms / 1.9 ms
PostgreSQLbufferedB1613.7 kread 0.91 ms / 4.8 ms; update 0.95 ms / 4.8 ms
PostgreSQLbufferedC13.14 kread 0.27 ms / 1.3 ms
PostgreSQLbufferedC47.20 kread 0.40 ms / 1.9 ms
PostgreSQLbufferedC1614.8 kread 0.89 ms / 4.1 ms
PostgreSQLbufferedD12.82 kread 0.28 ms / 1.4 ms; insert 0.30 ms / 1.3 ms
PostgreSQLbufferedD47.04 kread 0.40 ms / 1.9 ms; insert 0.44 ms / 2.0 ms
PostgreSQLbufferedD1614.4 kread 0.90 ms / 4.1 ms; insert 1.00 ms / 4.6 ms
PostgreSQLbufferedE11.26 kinsert 0.30 ms / 1.9 ms; scan 0.63 ms / 3.4 ms
PostgreSQLbufferedE42.00 kinsert 0.90 ms / 8.7 ms; scan 1.5 ms / 11.2 ms
PostgreSQLbufferedE162.07 kinsert 4.4 ms / 28.7 ms; scan 5.9 ms / 34.3 ms
PostgreSQLbufferedF12.09 kread 0.27 ms / 1.4 ms; rmw 0.54 ms / 2.0 ms
PostgreSQLbufferedF44.76 kread 0.42 ms / 1.9 ms; rmw 0.89 ms / 3.1 ms
PostgreSQLbufferedF169.22 kread 0.95 ms / 4.4 ms; rmw 1.9 ms / 8.8 ms
MongoDBdurableA11.97 kread 0.40 ms / 1.3 ms; update 0.53 ms / 1.7 ms
MongoDBdurableA44.37 kread 0.51 ms / 2.1 ms; update 0.84 ms / 4.1 ms
MongoDBdurableA166.56 kread 0.99 ms / 4.5 ms; update 2.2 ms / 15.5 ms
MongoDBdurableB12.48 kread 0.35 ms / 1.4 ms; update 0.57 ms / 1.8 ms
MongoDBdurableB46.12 kread 0.47 ms / 1.9 ms; update 0.82 ms / 3.1 ms
MongoDBdurableB1611.1 kread 1.1 ms / 5.0 ms; update 2.2 ms / 12.3 ms
MongoDBdurableD12.79 kread 0.31 ms / 1.3 ms; insert 0.54 ms / 2.0 ms
MongoDBdurableD46.50 kread 0.44 ms / 1.9 ms; insert 0.90 ms / 3.1 ms
MongoDBdurableD1612.0 kread 1.0 ms / 4.4 ms; insert 2.4 ms / 11.9 ms
MongoDBdurableE10.84 kinsert 0.78 ms / 4.9 ms; scan 1.0 ms / 5.1 ms
MongoDBdurableE41.94 kinsert 1.7 ms / 12.6 ms; scan 1.5 ms / 10.0 ms
MongoDBdurableE162.01 kinsert 5.7 ms / 29.2 ms; scan 6.0 ms / 31.9 ms
MongoDBdurableF11.33 kread 0.39 ms / 1.5 ms; rmw 0.92 ms / 2.8 ms
MongoDBdurableF43.12 kread 0.51 ms / 2.0 ms; rmw 1.4 ms / 5.7 ms
MongoDBdurableF165.00 kread 1.1 ms / 5.1 ms; rmw 3.5 ms / 34.3 ms
MongoDBbufferedA12.20 kread 0.41 ms / 1.5 ms; update 0.41 ms / 1.5 ms
MongoDBbufferedA45.22 kread 0.52 ms / 2.8 ms; update 0.52 ms / 2.8 ms
MongoDBbufferedA168.90 kread 1.2 ms / 9.6 ms; update 1.3 ms / 10.0 ms
MongoDBbufferedB12.22 kread 0.41 ms / 1.5 ms; update 0.45 ms / 1.6 ms
MongoDBbufferedB46.06 kread 0.50 ms / 2.0 ms; update 0.53 ms / 2.1 ms
MongoDBbufferedB1611.8 kread 1.1 ms / 5.2 ms; update 1.2 ms / 5.5 ms
MongoDBbufferedC12.14 kread 0.42 ms / 1.5 ms
MongoDBbufferedC46.52 kread 0.49 ms / 1.9 ms
MongoDBbufferedC1612.9 kread 1.0 ms / 4.6 ms
MongoDBbufferedD12.22 kread 0.40 ms / 1.5 ms; insert 0.43 ms / 1.5 ms
MongoDBbufferedD46.67 kread 0.48 ms / 1.9 ms; insert 0.48 ms / 1.9 ms
MongoDBbufferedD1613.2 kread 1.0 ms / 4.2 ms; insert 1.0 ms / 4.6 ms
MongoDBbufferedE10.85 kinsert 0.47 ms / 2.3 ms; scan 1.0 ms / 4.9 ms
MongoDBbufferedE41.96 kinsert 0.92 ms / 7.6 ms; scan 1.5 ms / 10.9 ms
MongoDBbufferedE162.02 kinsert 4.4 ms / 26.3 ms; scan 6.0 ms / 33.8 ms
MongoDBbufferedF11.40 kread 0.43 ms / 1.6 ms; rmw 0.86 ms / 2.4 ms
MongoDBbufferedF43.69 kread 0.52 ms / 2.7 ms; rmw 1.1 ms / 5.1 ms
MongoDBbufferedF166.60 kread 1.2 ms / 8.8 ms; rmw 2.4 ms / 14.6 ms
RedisdurableA12.03 kread 0.28 ms / 1.0 ms; update 0.65 ms / 1.8 ms
RedisdurableA43.88 kread 0.84 ms / 2.6 ms; update 0.98 ms / 2.9 ms
RedisdurableA168.53 kread 1.6 ms / 6.5 ms; update 1.6 ms / 6.5 ms
RedisdurableB13.51 kread 0.24 ms / 1.1 ms; update 0.62 ms / 1.8 ms
RedisdurableB46.26 kread 0.40 ms / 2.0 ms; update 0.83 ms / 2.9 ms
RedisdurableB169.25 kread 1.4 ms / 6.8 ms; update 1.8 ms / 8.8 ms
RedisdurableD13.59 kread 0.23 ms / 1.0 ms; insert 0.69 ms / 2.1 ms
RedisdurableD44.92 kread 0.55 ms / 3.1 ms; insert 1.2 ms / 5.9 ms
RedisdurableD1613.0 kread 1.1 ms / 4.2 ms; insert 1.4 ms / 5.5 ms
RedisdurableE10.65 kinsert 1.1 ms / 5.5 ms; scan 1.4 ms / 6.1 ms
RedisdurableE41.26 kinsert 1.6 ms / 10.9 ms; scan 2.5 ms / 14.2 ms
RedisdurableE160.93 kinsert 6.5 ms / 47.4 ms; scan 13.6 ms / 64.2 ms
RedisdurableF11.60 kread 0.28 ms / 1.2 ms; rmw 0.88 ms / 2.4 ms
RedisdurableF43.00 kread 0.72 ms / 2.4 ms; rmw 1.6 ms / 4.4 ms
RedisdurableF164.93 kread 1.8 ms / 8.7 ms; rmw 3.6 ms / 16.2 ms
RedisbufferedA12.74 kread 0.32 ms / 1.4 ms; update 0.32 ms / 1.5 ms
RedisbufferedA46.87 kread 0.46 ms / 2.0 ms; update 0.45 ms / 2.0 ms
RedisbufferedA168.35 kread 1.6 ms / 7.2 ms; update 1.6 ms / 7.2 ms
RedisbufferedB12.75 kread 0.32 ms / 1.5 ms; update 0.34 ms / 1.5 ms
RedisbufferedB44.82 kread 0.63 ms / 3.1 ms; update 0.69 ms / 3.2 ms
RedisbufferedB1613.5 kread 0.94 ms / 4.2 ms; update 0.96 ms / 4.2 ms
RedisbufferedC12.73 kread 0.32 ms / 1.5 ms
RedisbufferedC46.74 kread 0.45 ms / 2.0 ms
RedisbufferedC1614.0 kread 0.92 ms / 4.0 ms
RedisbufferedD12.85 kread 0.31 ms / 1.4 ms; insert 0.38 ms / 1.5 ms
RedisbufferedD44.95 kread 0.62 ms / 2.9 ms; insert 0.72 ms / 3.5 ms
RedisbufferedD1615.2 kread 0.88 ms / 3.2 ms; insert 0.91 ms / 3.6 ms
RedisbufferedE10.62 kinsert 0.44 ms / 1.9 ms; scan 1.5 ms / 6.2 ms
RedisbufferedE41.21 kinsert 0.99 ms / 8.8 ms; scan 2.6 ms / 15.7 ms
RedisbufferedE161.04 kinsert 5.1 ms / 35.4 ms; scan 11.9 ms / 59.5 ms
RedisbufferedF11.52 kread 0.36 ms / 1.6 ms; rmw 0.73 ms / 2.3 ms
RedisbufferedF44.59 kread 0.45 ms / 2.0 ms; rmw 0.91 ms / 3.3 ms
RedisbufferedF165.53 kread 1.6 ms / 7.4 ms; rmw 3.4 ms / 14.6 ms
RedissnapshotA12.80 kread 0.32 ms / 1.4 ms; update 0.31 ms / 1.4 ms
RedissnapshotA46.96 kread 0.44 ms / 2.0 ms; update 0.44 ms / 1.9 ms
RedissnapshotA168.60 kread 1.5 ms / 7.3 ms; update 1.5 ms / 7.2 ms
RedissnapshotB12.76 kread 0.31 ms / 1.5 ms; update 0.33 ms / 1.4 ms
RedissnapshotB44.98 kread 0.61 ms / 3.0 ms; update 0.65 ms / 2.7 ms
RedissnapshotB1614.4 kread 0.91 ms / 3.7 ms; update 0.92 ms / 3.8 ms
RedissnapshotD12.71 kread 0.31 ms / 1.5 ms; insert 0.38 ms / 1.6 ms
RedissnapshotD47.30 kread 0.41 ms / 1.9 ms; insert 0.44 ms / 2.0 ms
RedissnapshotD1615.5 kread 0.87 ms / 3.1 ms; insert 0.90 ms / 3.3 ms
RedissnapshotE10.62 kinsert 0.41 ms / 2.4 ms; scan 1.5 ms / 6.5 ms
RedissnapshotE41.22 kinsert 0.99 ms / 7.2 ms; scan 2.6 ms / 15.4 ms
RedissnapshotE161.04 kinsert 4.9 ms / 38.5 ms; scan 11.9 ms / 62.1 ms
RedissnapshotF11.87 kread 0.32 ms / 1.5 ms; rmw 0.63 ms / 2.0 ms
RedissnapshotF43.58 kread 0.59 ms / 2.5 ms; rmw 1.2 ms / 4.8 ms
RedissnapshotF169.20 kread 0.93 ms / 4.1 ms; rmw 2.0 ms / 7.8 ms