kevy4.0

Benchmarks

How fast, and where it isn't

One machine, 16 cores, loopback. Every figure is reproducible from bench/ in the repository. Read the last two rows before you decide anything — they are the ones where speed is not a reason to switch.

Four engines, one machine

50 connections, small values. Median of five runs, counted from each server's own command counter over a three-second steady window rather than from the benchmark client's reported rate.

kevy 4.0Redis 8valkey 9.1Dragonflyvs Redis 8
GET7,800,2995,597,8653,014,6872,132,2101.39×
SET6,918,0582,573,3961,749,9761,511,3772.69×
INCR6,133,9403,459,3952,484,2731,387,5681.77×
SADD5,600,5973,690,4832,385,8571,678,0981.52×
HSET4,287,2173,021,3251,970,7911,515,7631.42×
LPUSH3,213,4702,862,3741,943,2221,320,4971.12×
ZADD3,053,1012,773,9291,802,7591,455,1261.10×

LPUSH is 12% ahead of Redis 8, and ZADD 10%. At that margin your value sizes and key distribution decide the winner, not the engine — so if lists or sorted sets are your hot path, benchmark your own workload and do not switch for speed. The rows are coloured that way on purpose.

What this does not tell you

It is loopback. There is no network here, and in a real deployment the network is usually what you are waiting for. An engine 2.6× faster at GET will not make your p99 2.6× better if most of your latency is the wire.

The values are small. At 64 KB per value the whole thing becomes bound by the kernel's TCP path and the gap closes to single digits. If you store large blobs, these numbers are not about you.

It is one machine. kevy has no cluster mode. If your problem is that a single machine is not enough, no number on this page helps.

The browser build

What you actually ship to a tab.

Size
kevy.wasm416 KBthe engine, uncompressed
gzipped151 KBwhat crosses the wire
Cold start< 20 mscompile and instantiate, warm cache

localStorage beats kevy on a small synchronous read, and always will — it is a map in the page's own address space. kevy wins on the things that make localStorage a bad idea anyway: real TTLs, no 5 MB ceiling, byte values rather than strings, and writes that do not block the main thread.

Reproduce it

Two scripts. Everything on this page comes out of them.
git clone https://github.com/goliajp/kevy && cd kevy

# four-way: kevy, Redis 8, valkey, Dragonfly
bash bench/arena.sh

# the regression gate CI runs on every push
bash bench/perfgate.sh