有偏见的 基准测试
我们运行了性能测试,结果在下面出色的仪表板中
当然,请对结果持保留态度
0虚拟用户数
01k
1k2k
2k3k
3k
Drizzle vs Prisma

微型数据库大小
电子商务
PostgreSQL

联想 M720q
Linux 5.15.0-86-generic x86_64
Intel Core i3-9100T
内存 32GB DDR4 2666MHz
基准测试配置
Drizzle
v0.33.0
Bun Logo - Drizzle ORM 文档
prisma
v5.18.0
Bun Logo - Drizzle ORM 文档
平均延迟0.0ms
平均延迟0.0ms
平均0请求/秒
失败请求
Drizzle 处理了 xNaN更多请求
0
平均0请求/秒
失败请求
Drizzle 处理了 xNaN更多请求
0
平均 CPU 负载0.0%
平均 CPU 负载0.0%

工作原理

Drizzle 最初被设计为 SQL 之上的薄层,旨在引入最小的运行时开销。通过引入预处理语句和关系查询,我们取得了巨大的成功。现在,它既快速,又拥有出色的开发体验,并且关系查询没有 N+1 问题。

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

什么是有意义的基准测试?我们花了很多时间使用 mitata 进行合成基准测试,在同一个运行时中以及在独立的容器化环境中进行测试,以避免垃圾回收的交叉影响。社区也进行了他们自己的基准测试,并帮助我们定位关系查询性能和行读取的瓶颈,使它们变得非常快速和高效。

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

从业务角度来看,请求往返时间是衡量服务器端性能最重要的指标。虽然您可以通过 Cloudflare Argo 等服务影响网络延迟,但在服务器端,性能通常归结为数据库查询。

我们构建了一个测试用例,在 PostgreSQL 数据库中包含约 37 万条记录,并在 1GB 以太网上生成了类似生产环境的电子商务流量基准测试,以消除任何差异。在联想 M720q 上,Drizzle 可以处理 4.6k 请求/秒,同时保持约 100ms 的 p95 延迟。

我们在两台独立的机器上运行了基准测试,以确保观察者不会影响结果。对于数据库,我们使用了一个 PostgreSQL 实例,其中包含 42MB 的电子商务数据(约 37 万条记录)。
K6 基准测试实例运行在 MacBook Air 上,通过 1GB 以太网向配备 Intel Core i3-9100T 处理器和 32GB 内存的联想 M720q 发送 100 万个预处理请求。

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 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 运行测试 🚀