返回资讯中心
外部精选
软件工程
#开发者实时流

Speedrunner:用守护进程预加载,加速 Python、Ruby、PHP 和 Node CLI 工具启动

来源标题:Show HN: Speedrunner – Faster Startup: Python, Ruby, PHP and Node CLI Tools

Speedrunner 通过常驻守护进程预加载解释器和代码,再为每次调用 fork,让 aws、ansible、pytest 等 Python、Ruby、PHP、Node 命令行工具启动快 3 到 10 倍,且无需逐个工具配置。它支持 Linux(x86_64/aarch64)和 macOS,可用 srr 前缀调用,也能通过 shell 集成让原命令直接加速。

Hacker News 最新anthonygosme2026/11/3 · 今天21 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。


/ _| _ __ ___ ___ | | __ _ _ _ __ _ __ ___ _ __ _ | ' \ / _ / _ / | '__| | | | '_ \| '_ \ / _ \ '__| ___) | |_) | __/ __/ (_| | | | |_| | | | | | | | __/ | |____/| .__/ \___|\___|\__,_|_| \__,_|_| |_| |_| |_|\___|_| |_| aws、az、gcloud、ansible、black、pytest、rubocop、rspec、composer、artisan、eslint、npm: 日常使用的数百个命令行工具都是用 Python、Ruby、PHP 或 Node 写的,每次调用的大部分时间都花在 启动解释器和加载代码上,真正干活之前就已经耗掉了。 speedrunner 把这些事放到一个守护进程里做一次,然后每次调用都 fork 它:通常快 3 到 10 倍, 而且每个工具都不需要额外配置。 srr aws s3 ls # 任何 Python、Ruby、PHP 或 Node 工具,零配置 speedrunner exec ./script.sh # 整个脚本:它调用的每个工具都预加载 eval "$(speedrunner activate)" # 写在脚本开头:之后无需前缀 eval "$(speedrunner init zsh)" # 写在 ~/.zshrc(或 init bash,写在 ~/.bashrc):你打字时守护进程已在预热 speedrunner enroll aws # 之后在 zsh 或 bash 里直接敲aws s3 ls` 每条命令和选项、某次调用为何走原生路径、文件存放在哪里、如何卸载:见用户指南。 Linux(x86_64 或 aarch64,任意发行版)和 macOS 11 及以上(Intel 或 Apple Silicon):单个二进制文件,无需 root。 curl -fsSL https://raw.githubusercontent.com/anthonyGosme/speedrunner/main/install.sh | sh 安装脚本会校验下载文件的 SHA-256 校验和,并把 speedrunner 及其 srr 链接安装到 shell 能找到的位置:以 root 身份安装时装到 /usr/local/bin,否则装到 ~/.local/bin(如果该目录还不在 PATH 中,会追加到 /.profile、/.bashrc 和 ~/.zshrc; 设置 SPEEDRUNNER_NO_MODIFY_PATH=1 可保持这些文件不变)。不想把脚本直接管道给 sh?可以从 releases 下载归档文件及其 .sha256 校验文件。 也可以用包管理器。macOS 和 Linux 上用 Homebrew: brew install anthonyGosme/speedrunner/speedrunner Debian 和 Ubuntu(amd64、arm64),通过签名的 APT 仓库安装,这样每次发布都能 通过 apt upgrade 升级: sudo install -d -m 0755 /etc/apt/keyrings sudo curl -fsSLo /etc/apt/keyrings/speedrunner.asc https://anthonygosme.github.io/speedrunner/apt/speedrunner.asc sudo curl -fsSLo /etc/apt/sources.list.d/speedrunner.sources https://anthonygosme.github.io/speedrunner/apt/speedrunner.sources sudo apt update && sudo apt install speedrunner 该 .sources 条目只针对这个仓库信任该密钥。或者,不想配置更新的话, 可以直接安装某个发布版的 .deb:sudo apt install ./speedrunner<version>_amd64.deb。 在 Arch Linux 上,在 packaging/aur 目录里执行 makepkg -si 即可构建并安装 该包;等 AUR 注册重新开放后,它会以 speedrunner-bin 的名字出现在 AUR 上。 从 v0.3.0 起,每个归档文件和 .deb 还附带签名的构建来源证明: gh attestation verify <archive> --repo anthonyGosme/speedrunner 可校验它是本仓库的发布工作流 从打标签的提交构建出来的。 每个工具的守护进程都运行在该工具自己的解释器上:无需安装其他东西 (PHP 工具需要 PHP 的 FFI 扩展,Node 工具需要 Node 22.15 或更高版本,守护进程才能了解它们 加载了什么;否则收益更小,或者干脆走原生路径运行)。 已在 Debian 12、Ubuntu 22.04 和 24.04、Alpine 3.20 和 Fedora 42 上,用完整的回归测试套件 做过测试,覆盖 Python 3.9 到 3.14、Ruby 3.0 到 3.4、PHP 8.1 到 8.5 以及 Node 22 和 24,分别以 root 和普通用户身份运行(docker/test-all.sh);每个发布版还都在 macOS 15(Intel)和 macOS 26(Apple Silicon)上测试过。 然后可以用你手头的工具,看看它在你机器上能带来多少提升: speedrunner demo 结果 共服务 96 条命令(46 个 Python、18 个 Ruby、19 个 PHP、13 个 Node),96 条的输出都与原生运行完全一致。加速比:几何平均 x5.6,中位数 x4.9;77 条达到 x3 或以上,21 条达到 x10 或以上。 其中 69 条只打印版本号或帮助文本,测的纯粹是启动开销。真正干活的 27 条(对文件做 lint 或格式化、跑测试、列出一个项目)中位数加速 x4.0,其中 22 条达到 x3 或以上。 在 2 vCPU 的 Debian 12 VPS 上测得;标有 ¹ 的命令则在笔记本电脑(Intel i7-9750H)上的 Debian 12 容器中测得(Python 3.11.2、Ruby 3.1.2、PHP 8.2.35、Node 24.22.2)。守护进程已预热,未做任何工具特定的配置:每条命令都只是以 srr <command> 方式运行。每个时间值都是 20 次运行的中位数,原生运行和 speedrunner 交替进行;加速比是中位数的比值,附 95% 置信区间(bootstrap)。每个输出(退出码、stdout、stderr)都与原生运行的结果做了比较。均值、标准差、最小值、最大值、守护进程的内存以及每次运行的数据:20261030T212139Z-panel-vps;20261030T210248Z-candidates-docker;20261031T005026Z-node-panel-docker。 无收益:phpstan analyse 的时间花在分析本身,而不是解释器启动上。 wp 和 drush 未被代理:Composer 把它们安装在一个运行 PHP 的 shell 脚本背后,而 speedrunner 对这类启动器只跟进到 Python 为止。 无收益:nest --version:它加载的大部分内容都通不过守护进程的检查(加载时启动线程或读取命令行的模块),而且每次运行都要重新加载。 无收益:vite --version 经代理反而更慢:它的打包器在加载时启动线程,守护进程无法预加载,于是每次运行都要在单线程的 V8 里重新加载。 有些工具自带守护进程,因为它们启动太慢。当初为它们设计的场景是编辑器保存文件(一个小文件,每次调用前都会改动,确保没有结果缓存能应答),在笔记本电脑上的 Debian 12 容器里交替运行 20 次: 专用守护进程的客户端本身就是一个 Node、Python 或 Ruby 进程,每次调用都要启动;speedrunner 的客户端是一个 Rust 二进制文件,启动只需约一毫秒,而工具运行在已经加载好的 fork 里。以 curl 为客户端时 blackd 胜出。在大型项目上,专用守护进程会保留一些状态,而 speedrunner 每次调用都要重建(dmypy 的增量状态、typescript-eslint 的程序),因此可能更胜一筹;本对比未测量这一点。 协议与分析。 内存占用多少?每个工具在使用期间占用一个守护进程:典型的 Python、Ruby 或 PHP 工具为 28 到 40 MB(PSS 中位数,共享页按公平方式分摊),Node 工具约 60 MB,某些工具最高可达 200 MB的

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →