命令列工具
PerryTS/perry avatar
PerryTS/perry

Perry:從 README 拆解使用邊界

專案速覽:用 Rust 寫的本機 TypeScript 編譯器。使用 SWC 和 LLVM 將 TypeScript 直接編譯為執行檔。

4,834 個 Star161 個 ForkRustMIT

秒懂

它是什麼?
基於倉庫的基準測試 README,分析 Perry 的基準測試方法、結果和局限性。
適合誰用?
該基準測試頁面是一份詳盡且自我批判的比較,既包含同類執行環境也包含校準目標,並明確列出了未測量的內容。Perry 尚未達到 1.0 版本,因此這些數字僅反映其目前的 alpha 狀態。
可以商用嗎?
可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫在最近一天內有新的提交。
用什麼語言寫的?
主要是 Rust(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

專案概覽與基準測試頁面的定位:入口與定位

基於倉庫的基準測試 README,分析 Perry 的基準測試方法、結果和局限性。 本文只採用 perryts-perry README 已寫明的功能、數字、版本與限制,將它們放回實際使用者會遇到的選擇中。

Perry 是一個用 Rust 編寫的原生 TypeScript 編譯器。根據倉庫描述,它使用 SWC 和 LLVM 將 TypeScript 直接編譯為可執行檔。benchmarks/README.md 並非專案的主要文件,而是一個專門的基準測試頁面。該頁面將 Perry 與執行環境同類產品 Node 和 Bun、TypeScript 到原生的同類產品 AssemblyScript(搭配 json-as)以及編譯型原生語言(包括 Rust、Go、C++、Swift、Java、Kotlin 和 Python)進行對比。原生編譯器不被視為同類,而是作為校準基準,展示手寫、靜態型別、預先編譯程式碼的下限。該頁面旨在取信於懷疑者,公開了每一項實作、旗標和方法決策。(第 1 節的專案脈絡)

Perry 是一個用 Rust 編寫的原生 TypeScript 編譯器。根據倉庫描述,它使用 SWC 和 LLVM 將 TypeScript 直接編譯為可執行檔。benchmarks/README.md 並非專案的主要文件,而是一個專門的基準測試頁面。該頁面將 Perry 與執行環境同類產品 Node 和 Bun、TypeScript 到原生的同類產品 AssemblyScript(搭配 json-as)以及編譯型原生語言(包括 Rust、Go、C++、Swift、Java、Kotlin 和 Python)進行對比。原生編譯器不被視為同類,而是作為校準基準,展示手寫、靜態型別、預先編譯程式碼的下限。該頁面旨在取信於懷疑者,公開了每一項實作、旗標和方法決策。

基準測試頁面詳細記錄了其方法。硬體為 Apple M1 Max,64 GB 記憶體,執行 macOS 26.4。最新重新整理日期為 2026 年 5 月 14 日,版本為 v0.5.908。每個儲存格執行 11(針對 perryts-perry 的第 1 項核對)

在 perryts-perry 的脈絡下,這一節的判斷不是把 README 改寫成宣傳語,而是指出條件如何影響使用。請把 perryts-perry、README、實際命令與輸出放在同一份紀錄中,檢查輸入是否被正確接受、結果是否符合文件描述,以及限制是否在你的平台重現。這個核對點只對應本節的 入口,不把其他專案的經驗移植過來。

基準測試方法:資料與執行邊界

閱讀 perryts-perry 時,先分清專案宣稱的入口、依賴條件與輸出物。README 中的命令、檔案路徑和設定名稱,比抽象的效能形容更能界定它適合的工作。

基準測試頁面詳細記錄了其方法。硬體為 Apple M1 Max,64 GB 記憶體,執行 macOS 26.4。最新重新整理日期為 2026 年 5 月 14 日,版本為 v0.5.908。每個儲存格執行 11 次,並報告中位數、p95、總體標準差、最小值和最大值,而非最佳值。CPU 固定在 macOS 上使用排程器提示,在 Linux 上使用嚴格的 taskset 固定。頁面還指出一個 pre-1.0 注意事項:Perry 目前為 v0.5.908,因此數字可能隨版本變化。頁面還解釋了 Node 和 Bun 之間故意的非對稱處理:Node 執行預先編譯的 .mjs 檔案(在未計時的設定步驟中用 esbuild 或 tsc 剝離型別),而 Bun 直接執行 TypeScript 原始碼,因為直接執行 TypeScript 是 Bun 的原生輸入格式。(第 2 節的專案脈絡)

次,並報告中位數、p95、總體標準差、最小值和最大值,而非最佳值。CPU 固定在 macOS 上使用排程器提示,在 Linux 上使用嚴格的 taskset 固定。頁面還指出一個 pre-1.0 注意事項:Perry 目前為 v0.5.908,因此數字可能隨版本變化。頁面還解釋了 Node 和 Bun 之間故意的非對稱處理:Node 執行預先編譯的 .mjs 檔案(在未計時的設定步驟中用 esbuild 或 tsc 剝離型別),而 Bun 直接執行 TypeScript 原始碼,因為直接執行 TypeScript 是 Bun 的原生輸入格式。

兩個 JSON 工作負載是核心:驗證並往返(解析後直接字串化,不觸碰解析出的值)和解析並走訪(解析,累加每筆記錄的某個欄位,然後字串化)。Perry 的惰性磁帶(v0.5.204 引入)建立一個每值 12 位元組的磁帶,而非具體化的樹,並且可以在未修改的解析上直接複製原始 blob 進行字串化,類似於 simdjson 的 r(針對 perryts-perry 的第 2 項核對)

在 perryts-perry 的脈絡下,這一節的判斷不是把 README 改寫成宣傳語,而是指出條件如何影響使用。請把 perryts-perry、README、實際命令與輸出放在同一份紀錄中,檢查輸入是否被正確接受、結果是否符合文件描述,以及限制是否在你的平台重現。這個核對點只對應本節的 資料,不把其他專案的經驗移植過來。

JSON 基準測試:惰性磁帶及其局限:效能或功能取捨

對 perryts-perry 的限制不能被標題或單一範例掩蓋。若 README 只描述某個平台、資料格式或測試條件,這個範圍就是判讀結果的邊界,不能延伸成未提供的承諾。

兩個 JSON 工作負載是核心:驗證並往返(解析後直接字串化,不觸碰解析出的值)和解析並走訪(解析,累加每筆記錄的某個欄位,然後字串化)。Perry 的惰性磁帶(v0.5.204 引入)建立一個每值 12 位元組的磁帶,而非具體化的樹,並且可以在未修改的解析上直接複製原始 blob 進行字串化,類似於 simdjson 的 raw_json 檢視。在驗證並往返測試中,Perry 在動態型別執行環境中是最快的,中位數為 83 毫秒,Bun 為 249 毫秒,Node 為 377 毫秒,但 simdjson 以 24 毫秒領先。在解析並走訪測試中,磁帶必須具體化,Perry 的預設結果是 425 毫秒,比其自身的 mark-sweep 逃生艙(338 毫秒)慢,也比 Rust serde_json(182 毫秒)和 Bun(251 毫秒)慢。頁面還記錄了 RSS 迴歸(issue #745)在 v0.5.900 中部分修復,但 Perry 的 RSS 仍比其早期基線高出約 2.5 到 3 倍。(第 3 節的專案脈絡)

aw_json 檢視。在驗證並往返測試中,Perry 在動態型別執行環境中是最快的,中位數為 83 毫秒,Bun 為 249 毫秒,Node 為 377 毫秒,但 simdjson 以 24 毫秒領先。在解析並走訪測試中,磁帶必須具體化,Perry 的預設結果是 425 毫秒,比其自身的 mark-sweep 逃生艙(338 毫秒)慢,也比 Rust serde_json(182 毫秒)和 Bun(251 毫秒)慢。頁面還記錄了 RSS 迴歸(issue #745)在 v0.5.900 中部分修復,但 Perry 的 RSS 仍比其早期基線高出約 2.5 到 3 倍。

計算微基準涵蓋 fibonacci、loop_data_dependent、object_create、nested_loops,以及五個最佳化探針:loop_overhead、math_intensive、accumulate、array_read 和 array_write。fast-math 透(針對 perryts-perry 的第 3 項核對)

在 perryts-perry 的脈絡下,這一節的判斷不是把 README 改寫成宣傳語,而是指出條件如何影響使用。請把 perryts-perry、README、實際命令與輸出放在同一份紀錄中,檢查輸入是否被正確接受、結果是否符合文件描述,以及限制是否在你的平台重現。這個核對點只對應本節的 效能,不把其他專案的經驗移植過來。

計算微基準與 fast-math 旗標:實際核對方式

採用前可針對 perryts-perry 的專屬入口做小型核對:使用 README 指定的命令或檔案,觀察實際輸出、錯誤訊息、資源用量與版本差異。這些觀察點要和文中聲稱的能力逐項對照。

計算微基準涵蓋 fibonacci、loop_data_dependent、object_create、nested_loops,以及五個最佳化探針:loop_overhead、math_intensive、accumulate、array_read 和 array_write。fast-math 透過 --fast-math 旗標、PERRY_FAST_MATH 環境變數或 package.json 設定選擇啟用。它啟用 LLVM 對 f64 操作的 reassoc 和 contract 每指令旗標。預設情況下 Perry 產生與 Node 逐位一致的 f64 輸出。在 loop_overhead 上,Perry 預設為 97 毫秒,啟用 fast-math 後降至 12 毫秒,與 C++ 的 -ffast-math 相當。然而,loop_data_dependent(具有順序依賴鏈)不受影響:無論是否使用 fast-math,Perry 均為 225 毫秒。頁面強調這些是編譯器旗標探針,而非執行環境效能比較,loop_overhead 上的 8 倍加速是真實的,但僅適用於那種可折疊的累加器模式。(第 4 節的專案脈絡)

過 --fast-math 旗標、PERRY_FAST_MATH 環境變數或 package.json 設定選擇啟用。它啟用 LLVM 對 f64 操作的 reassoc 和 contract 每指令旗標。預設情況下 Perry 產生與 Node 逐位一致的 f64 輸出。在 loop_overhead 上,Perry 預設為 97 毫秒,啟用 fast-math 後降至 12 毫秒,與 C++ 的 -ffast-math 相當。然而,loop_data_dependent(具有順序依賴鏈)不受影響:無論是否使用 fast-math,Perry 均為 225 毫秒。頁面強調這些是編譯器旗標探針,而非執行環境效能比較,loop_overhead 上的 8 倍加速是真實的,但僅適用於那種可折疊的累加器模式。

頁面包含六個記憶體和 GC 測試,每個測試在三種 GC 模式組合(預設、mark-sweep 逃生艙、帶寫屏障的 gen-gc)下執行,每次 CI 呼叫共 18 次執(針對 perryts-perry 的第 4 項核對)

在 perryts-perry 的脈絡下,這一節的判斷不是把 README 改寫成宣傳語,而是指出條件如何影響使用。請把 perryts-perry、README、實際命令與輸出放在同一份紀錄中,檢查輸入是否被正確接受、結果是否符合文件描述,以及限制是否在你的平台重現。這個核對點只對應本節的 命令,不把其他專案的經驗移植過來。

記憶體與 GC 穩定性測試:適用範圍

perryts-perry 的取捨最後取決於你的輸入和部署環境。適合需要 README 所列能力、能接受其平台與成熟度限制的人;若需求落在文件未說明的範圍,應先把缺口視為未知,而不是自行補上。

頁面包含六個記憶體和 GC 測試,每個測試在三種 GC 模式組合(預設、mark-sweep 逃生艙、帶寫屏障的 gen-gc)下執行,每次 CI 呼叫共 18 次執行。所有 18 個儲存格在目前提交中均通過。這些測試旨在捕獲特定洩漏模式,如區塊固定、稀疏快取洩漏和閉包環境保留。例如,test_memory_json_churn 在 v0.5.237 將分代 GC 設為預設後,從 115 MB 降至 91 MB。頁面還展示了 bench_json_roundtrip 的歷史 RSS 表,包括迴歸和部分修復。(第 5 節的專案脈絡)

行。所有 18 個儲存格在目前提交中均通過。這些測試旨在捕獲特定洩漏模式,如區塊固定、稀疏快取洩漏和閉包環境保留。例如,test_memory_json_churn 在 v0.5.237 將分代 GC 設為預設後,從 115 MB 降至 91 MB。頁面還展示了 bench_json_roundtrip 的歷史 RSS 表,包括迴歸和部分修復。

README 明確列出了基準測試未涵蓋的內容:GC 延遲和尾部延遲、JIT 預熱行為(雖然執行了預熱疊代,但未報告真實冷啟動)、非同步/等待、任何 I/O、真實應用負載、爭用下的記憶體壓力,以及編譯時間或二進位大小(僅提及 hello world 約為 1 MB)。頁面還包含誠實的免責聲明,例如惰性磁帶優勢的工作負載特定性,以及動態型別與型別化結構之間 RSS 差距的根本性。總體而言,Perry 在某些工作負載上與動態型別執行環境具有競爭力,但在 SIMD 加速解析器和型別化反序列化方面落後,且專案處於 pre-1.0 狀態。(針對 perryts-perry 的第 5 項核對)

在 perryts-perry 的脈絡下,這一節的判斷不是把 README 改寫成宣傳語,而是指出條件如何影響使用。請把 perryts-perry、README、實際命令與輸出放在同一份紀錄中,檢查輸入是否被正確接受、結果是否符合文件描述,以及限制是否在你的平台重現。這個核對點只對應本節的 範圍,不把其他專案的經驗移植過來。

編輯結論

該基準測試頁面是一份詳盡且自我批判的比較,既包含同類執行環境也包含校準目標,並明確列出了未測量的內容。Perry 尚未達到 1.0 版本,因此這些數字僅反映其目前的 alpha 狀態。 適合需要 perryts-perry README 所列能力、並能接受文件範圍的人;不適合把未說明的行為當成保證。先依 README 的專屬命令、設定或檔案完成一個最小案例,逐項觀察輸出與錯誤,再決定是否放進正式流程。

官方來源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社群筆記

社群筆記