Quay lại các so sánh
Runtime TypeScript

Perry vs Bun

Bun là một runtime JavaScript/TypeScript tất-cả-trong-một, kèm bundler, trình quản lý gói và test runner; nó cũng có thể tạo tệp thực thi đơn lẻ bằng cách đóng gói runtime của mình cùng mã của bạn. Perry đi theo một con đường khác: biên dịch TypeScript trực tiếp thành mã máy gốc qua LLVM — không có engine JavaScript trong binary, không có runtime, chỉ là một tệp thực thi gốc nhỏ gọn. Bun và Perry chồng lấn ở đầu ra TS-to-binary nhưng bất đồng về việc có nên có engine JavaScript trong binary đó hay không.

Bun là gì?

Bun là một bộ công cụ JavaScript và TypeScript tất-cả-trong-một, nhanh, được xây dựng bằng Zig. Nó chạy trực tiếp mã nguồn `.ts` (không cần bước tiền biên dịch), sử dụng JavaScriptCore làm engine JS, và bao gồm bundler, trình quản lý gói và test runner. `bun build --compile` đóng gói runtime Bun cùng ứng dụng của bạn thành một tệp thực thi duy nhất. Bun nhắm đến Linux, macOS và Windows trên x64 và arm64.

Perry là gì?

Perry là một trình biên dịch TypeScript gốc được viết bằng Rust. Nó biên dịch TypeScript trực tiếp thành mã máy gốc qua LLVM — không có engine JavaScript, không có runtime, không có JIT. Đầu ra là một binary đơn lẻ (khoảng 330 KB cho hello world; ~48 MB cho một ứng dụng đầy đủ stdlib như máy chủ Fastify). Perry nhắm đến 10 nền tảng bao gồm macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly và Web.

So sánh song song

Tính năngPerryBun
Đầu raMã máy gốc (LLVM)Mã của bạn + runtime Bun đóng gói trong một binary
Engine JavaScript trong binaryKhông có mặc định; tùy chọn V8 với --enable-js-runtime (+~15 MB)JavaScriptCore, luôn luôn
Kích thước binary hello-world~330 KB~50–100 MB (bao gồm runtime Bun)
JITKhông (biên dịch AOT)Có (JIT của JavaScriptCore)
Mục tiêu di động (iOS, Android)Có — UI gốc qua UIKit/JNIKhông
Mục tiêu Watch / TVwatchOS, tvOS, Wear OSKhông
Widget UI gốc25+ qua AppKit, UIKit, GTK4, Win32, JNIKhông (tập trung server/CLI)
Hệ sinh thái npmCác gói TS/JS thuần có thể biên dịch gốc; gói khác qua V8 tùy chọnnpm tương thích Node đầy đủ
Độ ổn địnhTrước 1.0 (alpha)Ổn định (1.x)
Được xây dựng bằngRustZig

Perry thắng ở đâu

  • +Binary nhỏ hơn — hello world của Perry chỉ ~330 KB; hello world Bun --compile bao gồm runtime Bun và lên tới hàng chục megabyte.
  • +Không có chi phí engine JavaScript. Binary Perry biên dịch không mang theo trình thông dịch hay JIT — TypeScript của bạn chính là tệp thực thi.
  • +Di động, watch và TV. Perry biên dịch sang iOS, iPadOS, Android, watchOS, tvOS và WebAssembly. Bun chỉ dành cho server/desktop.
  • +UI gốc. Module perry/ui của Perry biên dịch thành widget nền tảng thực sự (AppKit trên macOS, UIKit trên iOS, GTK4 trên Linux, Win32 trên Windows, JNI trên Android). Bun không có giải pháp UI.
  • +Nhanh hơn ở hầu hết microbench tính toán đo trong điều kiện tương đương trên M1 Max (RUNS=11, v0.5.279, 2026-04-25): fibonacci 318 ms vs Bun 589 ms; object_create 1 ms vs 6 ms; nested_loops 18 ms vs 21 ms. Xem perry/benchmarks để có bảng đầy đủ.
  • +Nhanh hơn ở JSON validate-and-roundtrip trong nhóm runtime kiểu động: lazy JSON tape của Perry đáp ở 75 ms trung vị so với 259 ms của Bun trên cùng workload 10k bản ghi.

Bun thắng ở đâu

  • +Runtime trưởng thành, ổn định với các bản phát hành 1.x. Perry còn ở giai đoạn trước 1.0.
  • +Nhanh hơn ở JSON parse-and-iterate (nơi mọi giá trị đều được duyệt qua): Bun 254 ms vs Perry 466 ms trung vị trên cùng workload — lazy tape của Perry không thể đi tắt khi việc lặp được bắt buộc.
  • +Hệ sinh thái npm tương thích Node đầy đủ ngay từ đầu. Perry chạy gốc một tập con và quay lại V8 nhúng tùy chọn cho phần còn lại.
  • +Tích hợp sẵn test runner, bundler và trình quản lý gói. Perry là một trình biên dịch — công cụ kề cận thì tách biệt.
  • +Hiệu năng JIT đã làm nóng có thể vượt qua AOT trên mã thiên về lặp với vòng lặp bên trong nóng; Perry không có JIT.
  • +Ngang bằng với Perry trong khoảng nhiễu giữa các lần chạy trên `loop_data_dependent` (232 ms vs 235 ms) — kernel f64 thực sự không thể fold mà cả hai bên trình biên dịch đều không thể đảo thứ tự. Nguồn: perry/benchmarks RUNS=11.

Khi nào nên chọn Perry

Chọn Perry khi kích thước binary quan trọng (phân phối di động, ngữ cảnh nhúng, khởi động nguội nhanh), khi bạn muốn xuất bản đến mobile/watch/TV từ một mã nguồn TypeScript duy nhất, khi bạn muốn widget UI gốc, hoặc khi bạn không muốn có engine JavaScript trong artifact đã xuất bản.

Khi nào nên chọn Bun

Chọn Bun khi bạn cần một runtime ổn định, trưởng thành ngay hôm nay, khi tương thích npm đầy đủ là không thể thương lượng, khi bạn muốn một công cụ duy nhất cho runtime + bundler + trình quản lý gói + test runner, hoặc khi hiệu năng JIT đã làm nóng trên workload chạy lâu quan trọng với bạn hơn kích thước khởi động nguội.

Kết luận

Bun và Perry đều cho phép xuất bản chương trình TypeScript dưới dạng một binary đơn lẻ, nhưng chúng trả lời những câu hỏi khác nhau. Binary của Bun chứa runtime Bun và được tối ưu cho workload backend/CLI nơi JIT và tương thích Node đầy đủ chiến thắng. Binary của Perry không chứa engine JS và được tối ưu cho kích thước, khởi động nguội, di động và UI gốc. Nếu bạn xuất bản máy chủ, Bun đã được chứng minh hơn hiện tại. Nếu bạn xuất bản ứng dụng gốc hoặc quan tâm đến kích thước binary, Perry được xây dựng cho trường hợp đó.

Thử Perry

Biên dịch TypeScript của bạn thành mã gốc ngay hôm nay.

Bắt đầu