返回首页

Dart 后端:基准测试和内存问题

开发者测试 Dart 以替换 SaaS 中的 Node.js。基准测试揭示问题:延迟 9.5s p95,K8s 中内存未返回。生态系统薄弱,VM 为 Flutter 量身定制。

为什么 Dart 在服务器上比 Node.js 差:RPS 和 GC 测试
Advertisement 728x90

服务器端Dart:为何在生产负载下崩盘

一位SaaS开发者为降低内存占用,将Node.js换成Dart。预期:启动仅10 MB对标80 MB,AOT编译,静态类型。现实:两周开发时间,自建框架,基准测试性能更差。教训:迁移前务必在生产负载上跑真实基准测试。

认证服务(OAuth2、Redis ORM)作为测试场。Node.js峰值500 MB但会释放内存。数百实例启动80 MB才是核心痛点。

生态系统:后端工具一片荒芜

Dart是为Flutter打造的。没有NestJS那样的框架,Redis客户端鲜有能媲美ioredis的。Shelf只是基础路由器,Serverpod针对全栈Flutter应用。

Google AdInline article slot

不得不从零搭建框架:

  • 类似Angular的树状DI。
  • 通过Zone实现请求作用域。
  • 带代码生成的CLI,支持AOT。

移植了ts-oauth2-server和ioredis(Dart 4500行 vs. TS 23500行)。AI搞定,但代价不小:实验性--enable-experiment=enhanced-parts标志,到处part 'file.g.dart',提交时需打补丁或CI生成。

AOT模式下反射没了。Type只是个空壳,无法静态调用方法。没有mirrors的DI,需要CLI在JIT下用mirrors生成代码。在TS/Java/C#中,三行反射代码搞定。

Google AdInline article slot

语言:语法优雅,元编程噩梦

逻辑清晰的语法,编译期错误检查。但对象上无for...in,无反射。代码生成是个灾难:.g.dart引用弄脏源码文件。

AI机械移植ioredis。结果:RPS比pub.dev最佳客户端高5%。后端生态RIP——没人用Dart写服务器代码。

基准测试:延迟和内存双杀

场景:3个端点,Postgres、Redis。纯HTTP,无框架。100m CPU,500 VUS。

Google AdInline article slot

| 指标 | Dart AOT | Node.js | Go |

|---------|----------|---------|----|

| RSS启动 | 3 MB | 18 MB | - |

| p95延迟 | 9.5 s | 5 s | 2.9 s |

| RPS | 比Node差2倍 | - | 整体最佳 |

| 峰值RSS | 39-47 MB | 37 MB | - |

Dart:

  • 峰值后不归还内存给OS(>5%)。
  • GC高压下顿 stutter:调优为60fps(Flutter),非K8s的RSS。
  • 限流下膨胀至47 MB;Node则收缩。

GC标志(--dontneed_on_sweep--use_compactor)无济于事。设计如此:移动端VM。K8s视40 MB/pod为常驻,HPA无法紧凑打包节点。启动节省被过度预置吞没。

Cloud Run上:Dart比Node贵——更慢+攥紧内存。

关键教训:

  • p95延迟9.5 s vs. Node 5 s = 生产故障。
  • 内存不释放:扩容超支。
  • 生态仅Flutter外死寂。
  • 仓库基准:K8s清单、CPU剖析、Dockerfile。

结论:Dart的专属领地仅Flutter

两周扔在框架、移植、测试上。Dart适合简单代码,但服务器端彻底失败。无反射、VM不适云原生、代码生成地狱。官方“Cloud Run可扩展API”承诺落空。

err != nilcontext.Context拒Go。Node.js胜出:释放内存,延迟更优。

— Editorial Team

Advertisement 728x90

继续阅读