Skip to content

dope-rs

Zero cost abstractions.

sqlx 0.8 + SQLite query(…).fetch_one(&pool).await
  1. fetch_one → Box<dyn Future>~80
  2. Semaphore::acquire atomic~20
  3. ArrayQueue::pop lock-free~20
  4. ⇅ flume::send channel~3000
  5. StatementCache::get LruCache~60
  6. sqlite3_reset cache hit~50
  7. sqlite3_bind_int64~20
  8. sqlite3_step~800
  9. sqlite3_column ×3~90
  10. build SqliteRow Box+Arc · heap~120
  11. ⇅ flume::send channel~3000
  12. try_get ×3 → Decode by-name HashMap~150
7,400 cycles.
cartel on dope Users::by_id(&client, 1).await
  1. run_one::<Q> generated~5
  2. stmt by name prepared at startup~5
  3. frame_typed Bind+Execute → o3 buf~40
  4. io_uring send_msg vectored~60
  5. ↻ await same core resumes~30
  6. decode_row fn ptr → Row::decode~40
180 cycles.
01

Compile‑time abstractions

Generics monomorphized; SQL and routes generated before the program runs. No dyn, no vtables.

02

No hidden bullshit

No pool, no worker thread, no scheduler behind your back. You see every call.

03

Thread‑per‑core

One runtime per core, shared-nothing. No atomics, no Arc, no channels between cores.

04

io_uring‑first

Built and tuned for io_uring. kqueue is just a dev stand-in for macOS — not a second target.

The stack

MIT-license, 2026 @dope-rs