主观 基准测试
我们进行了性能测试,结果在下面很棒的仪表板中
当然,要对他们的话持保留态度。
0 VUs
01k
1k2k
2k3k
3k
Drizzle vs Prisma

Micro database size
E-commerce
PostgreSQL

Lenovo M720q
Linux 5.15.0-86-generic x86_64
Intel Core i3-9100T
RAM 32GB DDR4 2666MHz
Benchmark Config
Drizzle
v0.33.0
Bun Logo
prisma
v5.18.0
Bun Logo
avg latency: 0.0ms
avg latency: 0.0ms
avg: 0 req/sec
Failed requests
Drizzle handled xNaN more requests
0
avg: 0 req/sec
Failed requests
Drizzle handled xNaN more requests
0
avg CPU load: 0.0%
avg CPU load: 0.0%

工作原理

Drizzle 最初被设计为一个位于 SQL 之上的薄层,引入最小的运行时开销,并通过引入预准备语句和关系查询,我们已经打破了它。现在它既快速又具有出色的 DX,并且没有关系查询的 n+1 问题。

但是它有多快?是 Drizzle 快还是 SQL 快?测量什么?

什么是有意义的基准测试? 我们花了很多时间使用 mitata 进行合成基准测试,在单个运行时中测试一切,然后在单独的容器化环境中测试,以确保没有 GC 交叉影响。社区成员制作了自己的基准测试,帮助我们分配关系查询性能和行读取瓶颈,并使它们变得非常快速和高效。

我们测试了所有竞争对手的不同 SQL 方言,虽然我们在某些情况下比 Prisma 使用 SQLite 快 100 倍以上,但我们只希望分享对企业和开发者有意义的基准测试。

从商业角度来看,请求往返是最重要的指标,当涉及到服务器性能时。虽然你可以通过像 Cloudflare Argo 这样的服务来影响网络延迟,但在服务器端,通常归结为数据库查询。

我们使用了一个包含大约 370k 条记录的 PostgreSQL 数据库测试用例,并在 1GB 以太网上生成了类似生产的电子商务流量基准测试,以消除任何差异。在 Lenovo M720q 上,Drizzle 可以处理 4.6k reqs/s,同时保持约 100ms 的 p95 延迟。

我们在两台不同的机器上运行了基准测试,以确保观察者不会影响结果。对于数据库,我们使用了一个包含 42MB 电子商务数据的 PostgreSQL 实例(大约 370k 条记录)。 K6基准测试实例运行在 MacBook Ai r上,通过 1GB 以太网向配备 Intel Core i3-9100T 和 32GB RAM 的 Lenovo M720q 发送了 1M 个预制请求

image

运行自己的测试 - 遵循以下说明!

准备测试机

  1. 使用 pnpm start:docker 命令启动一个包含 PostgreSQL 的 Docker 容器。你可以在 ./src/docker.ts 文件中配置所需的数据库端口:
...
}

const desiredPostgresPort = 5432; // change here
main();
  1. 在 .env 文件中使用分配的数据库端口更新 DATABASE_URL
DATABASE_URL="postgres://postgres:postgres@localhost:5432/postgres"
  1. 使用 pnpm start:seed 命令为你的数据库填充测试数据,你可以在 ./src/seed.ts 文件中更改数据库的大小。
...
}

main("micro"); // nano | micro
  1. 确保你已经安装了 Node.js 版本 18 或更高版本。你可以使用 nvm use 18 命令。
  2. 启动 Drizzle/Prisma 服务器:
## Drizzle
pnpm start:drizzle

## Prisma
pnpm prepare:prisma
pnpm start:prisma

准备测试机器

  1. 使用 pnpm start:generate 生成一个HTTP请求列表。它会将需要运行在测试服务器上的HTTP请求列表输出到 ./data/requests.json 文件中。
  2. 安装 k6 负载测试器
  3. ./k6.js 文件中配置测试服务器的URL。
// const host = `http://192.168.31.144:3000`; // drizzle
const host = `http://192.168.31.144:3001`; // prisma
  1. 使用 k6 run bench.js 运行测试 🚀