Perry vs Bun
Bun เป็นชุดเครื่องมือ JavaScript/TypeScript แบบออลอินวันที่รวมรันไทม์, bundler, package manager และ test runner เข้าด้วยกัน และยังสามารถสร้างไฟล์ปฏิบัติการไฟล์เดียวได้โดยรวมรันไทม์ของตัวเองเข้ากับโค้ดของคุณ Perry เลือกเส้นทางที่แตกต่าง: คอมไพล์ TypeScript ตรงเป็นโค้ดเครื่องเนทีฟผ่าน LLVM — ไม่มี JavaScript engine ในไบนารี ไม่มีรันไทม์ มีเพียงไฟล์ปฏิบัติการเนทีฟขนาดเล็ก Bun และ Perry เห็นพ้องในเรื่องเอาต์พุต TS-to-binary แต่เห็นต่างว่าใน binary นั้นควรมี JavaScript engine หรือไม่
Bun คืออะไร?
Bun เป็นชุดเครื่องมือ JavaScript และ TypeScript ออลอินวันที่รวดเร็ว สร้างด้วย Zig รันไฟล์ `.ts` ได้โดยตรง (ไม่ต้องคอมไพล์ก่อน) ใช้ JavaScriptCore เป็น JS engine และมาพร้อม bundler, package manager และ test runner คำสั่ง `bun build --compile` รวมรันไทม์ Bun เข้ากับแอปพลิเคชันของคุณเป็นไฟล์ปฏิบัติการเดียว Bun รองรับ Linux, macOS และ Windows บน x64 และ arm64
Perry คืออะไร?
Perry เป็นคอมไพเลอร์ TypeScript เนทีฟที่เขียนด้วย Rust คอมไพล์ TypeScript ตรงเป็นโค้ดเครื่องเนทีฟผ่าน LLVM — ไม่มี JavaScript engine ไม่มีรันไทม์ ไม่มี JIT เอาต์พุตเป็นไบนารีไฟล์เดียว (ราว 330 KB สำหรับ hello world; ราว 48 MB สำหรับแอปที่ใช้ stdlib เต็มรูปแบบเช่นเซิร์ฟเวอร์ Fastify) Perry รองรับ 10 แพลตฟอร์มรวมถึง macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly และเว็บ
เคียงข้างกัน
| ฟีเจอร์ | Perry | Bun |
|---|---|---|
| เอาต์พุต | โค้ดเครื่องเนทีฟ (LLVM) | โค้ดของคุณ + รันไทม์ Bun รวมในไบนารีเดียว |
| JavaScript engine ในไบนารี | ไม่มีโดยค่าเริ่มต้น; V8 เสริมด้วย --enable-js-runtime (+~15 MB) | JavaScriptCore เสมอ |
| ขนาดไบนารี hello-world | ~330 KB | ~50–100 MB (รวมรันไทม์ Bun) |
| JIT | ไม่มี (คอมไพล์แบบ AOT) | มี (JavaScriptCore JIT) |
| เป้าหมายมือถือ (iOS, Android) | ใช่ — UI เนทีฟผ่าน UIKit/JNI | ไม่ |
| เป้าหมาย Watch / TV | watchOS, tvOS, Wear OS | ไม่ |
| วิดเจ็ต UI เนทีฟ | 25+ ผ่าน AppKit, UIKit, GTK4, Win32, JNI | ไม่ (มุ่งเน้น server/CLI) |
| ระบบนิเวศ npm | แพ็กเกจ TS/JS ล้วนคอมไพล์เนทีฟได้; แพ็กเกจอื่นผ่าน V8 เสริม | npm ที่เข้ากันได้กับ Node เต็มรูปแบบ |
| ความเสถียร | Pre-1.0 (alpha) | เสถียร (1.x) |
| สร้างด้วย | Rust | Zig |
จุดที่ Perry ชนะ
- +ไบนารีขนาดเล็กกว่า — Perry hello world มีขนาด ~330 KB; Bun --compile hello world รวมรันไทม์ Bun และมีขนาดในระดับสิบ MB
- +ไม่มีต้นทุน JavaScript engine ไบนารีที่คอมไพล์ด้วย Perry ไม่มี interpreter หรือ JIT — TypeScript ของคุณคือไฟล์ปฏิบัติการ
- +มือถือ, watch และ TV Perry คอมไพล์เป็น iOS, iPadOS, Android, watchOS, tvOS และ WebAssembly Bun เป็น server/desktop เท่านั้น
- +UI เนทีฟ โมดูล perry/ui ของ Perry คอมไพล์เป็นวิดเจ็ตแพลตฟอร์มจริง (AppKit บน macOS, UIKit บน iOS, GTK4 บน Linux, Win32 บน Windows, JNI บน Android) Bun ไม่มี story ด้าน UI
- +เร็วกว่าใน microbenchmark ด้านการคำนวณส่วนใหญ่ภายใต้เงื่อนไขที่เทียบเท่ากันบน 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 ดูตารางเต็มที่ perry/benchmarks
- +เร็วกว่าใน JSON validate-and-roundtrip ในกลุ่ม dynamic typing: lazy JSON tape ของ Perry ทำได้ค่ากลาง 75 ms vs 259 ms ของ Bun บน workload 10k record เดียวกัน
จุดที่ Bun ชนะ
- +รันไทม์ที่เสถียรและสมบูรณ์พร้อมรุ่น 1.x Perry ยังเป็น pre-1.0
- +เร็วกว่าใน JSON parse-and-iterate (เมื่อต้องเข้าถึงทุกค่า): Bun 254 ms vs Perry 466 ms ค่ากลางบน workload เดียวกัน — lazy tape ของ Perry ไม่สามารถข้ามขั้นตอนได้เมื่อถูกบังคับให้ iterate
- +ระบบนิเวศ npm ที่เข้ากันได้กับ Node เต็มรูปแบบทันทีที่ติดตั้ง Perry รันบางส่วนแบบเนทีฟและกลับไปใช้ V8 ฝังในตัวเป็นทางเลือกสำหรับส่วนที่เหลือ
- +Test runner, bundler และ package manager ในตัว Perry เป็นคอมไพเลอร์ — เครื่องมือเสริมแยกต่างหาก
- +ประสิทธิภาพ JIT-warm สามารถแซง AOT บนโค้ดที่มีการ iterate หนักและมี hot inner loop; Perry ไม่มี JIT
- +เสมอกับ Perry ภายใน noise ระหว่างการรันบน `loop_data_dependent` (232 ms vs 235 ms) — kernel f64 ที่ไม่สามารถพับรวมได้จริง ๆ ที่คอมไพเลอร์ทั้งสองฝั่งไม่สามารถจัดเรียงใหม่ได้ ที่มา: perry/benchmarks RUNS=11
เมื่อใดควรเลือก Perry
เลือก Perry เมื่อขนาดไบนารีมีความสำคัญ (การกระจายมือถือ, บริบทแบบฝัง, cold start ที่รวดเร็ว) เมื่อคุณต้องการส่งมอบไปยังมือถือ/watch/TV จากโค้ดเบส TypeScript เดียว เมื่อคุณต้องการวิดเจ็ต UI เนทีฟ หรือเมื่อคุณไม่ต้องการมี JavaScript engine ในไบนารีที่ส่งมอบเลย
เมื่อใดควรเลือก Bun
เลือก Bun เมื่อคุณต้องการรันไทม์ที่เสถียรและสมบูรณ์ในวันนี้ เมื่อความเข้ากันได้กับ npm เต็มรูปแบบเป็นเรื่องจำเป็น เมื่อคุณต้องการเครื่องมือเดียวสำหรับรันไทม์ + bundler + package manager + test runner หรือเมื่อประสิทธิภาพ JIT-warm บน workload ที่รันยาวนานสำคัญสำหรับคุณมากกว่าขนาด cold start
บทสรุป
Bun และ Perry ต่างก็ให้คุณส่งมอบโปรแกรม TypeScript เป็นไบนารีเดียวได้ แต่ตอบโจทย์ที่แตกต่างกัน ไบนารีของ Bun มีรันไทม์ Bun และเหมาะกับ workload backend/CLI ที่ JIT และความเข้ากันได้กับ Node เต็มรูปแบบเป็นจุดแข็ง ไบนารีของ Perry ไม่มี JS engine และเหมาะกับขนาด, cold start, มือถือ และ UI เนทีฟ ถ้าคุณกำลังส่งมอบเซิร์ฟเวอร์ Bun ผ่านการพิสูจน์มามากกว่าในวันนี้ ถ้าคุณกำลังส่งมอบแอปเนทีฟหรือสนใจขนาดไบนารี Perry ถูกสร้างมาเพื่อกรณีนั้น