2026 年 9 月 10 日,Julia 1.13 正式发布。在官方长长的更新清单里,找不到提升峰值算力的底层架构大改。语言核心团队将开发重心转向了长期困扰社区的可用性问题。这些问题集中在首次出结果时间(TTFX)、垃圾回收停顿与终端交互体验上。工程团队正在进行一场面向可用性痼疾的专项清剿。他们抛弃了对算力跑分天花板的无尽追逐。当一门语言的执行速度已经能够在基准测试里对标 C 语言时,它将更多的开发资源投入到了留住用户的工程体感上。
启动耗时度量成为代码合入卡点
首次出结果时间包含了预编译模块包、加载模块包与最终运行代码三部分成本。这一环节的迟缓一直是 Julia 无法作为日常短时任务脚本语言使用的短板。在社区维护的 Julia-TTFX-Snippets 工作流中,官方对 39 个真实用例进行了全面度量。度量结果在两款硬件上呈现了实质性的突破。在 AMD Ryzen 9 5950X 平台上,1.13 的预编译耗时比 1.12 缩减了 29%,比 1.10 (LTS) 长期支持版快 22%。在 Apple M5 Pro 平台上,该耗时比 1.12 缩减 27%,比 1.10 快 7%。预编译过程取两次最快成绩,加载与执行则取三次最快成绩的几何平均值。
运行环境启动耗时本身也在同步下降。在 20 次 hyperfine 循环实测中,基础启动耗时从 1.12 版本的 69.1 毫秒(±1.0 毫秒)降至 1.13 版本的 56.7 毫秒(±0.5 毫秒)。整体启动耗时缩短了约 20%。这并非单纯的偶然代码优化,而是开发流程改造的结果。官方在主分支上建立了专属的 TTFX 持续集成任务。测试结果的追踪系统被部署在专有域名下,每次代码合并请求都必须通过耗时审查。将零散的性能测量变成开发流程的强制门禁,直接堵死性能退化在微小代码提交中暗中积累的漏洞。
zstd 压缩降低全局构建开销
生态系统的依赖解析与拉取环节也获得了多项专项优化。包管理器的默认网络下载压缩算法由传统的 gzip 切换为 zstd。以打包了 Plots、Makie 和 ModelingToolkit 的生态集为例。总计 405 个相关文件的体积从 307.99MB 压减至 239.31MB。文件解压总耗时由 8.77 秒缩减至 5.50 秒,平均单次解压时间从 21.98 毫秒降至 13.77 毫秒。
额外加入的优化还包括注册表直接进入缓存清单、递归收集源码资源。添加依赖包时也会优先匹配已加载版本。测试套件中也不再默认开启严格的边界检查。用少量的解压算力换取传输带宽,大幅拉升了本地环境构建时的 I/O 效率。文件体积缩小近五分之一,直接缓解了全球分发镜像源的公有云流量账单压力。单次解压速度提升近七成,有效消解了现代流水线在容器中频繁拉取环境时的等待枯竭感。伴随着模块依赖工具链的完善,项目裁剪工具 juliac.jl 也正式独立为 JuliaC.jl 包。它提供了裁减 finalizer、@cfunction 和 mapreduce 的底层控制能力,为构建极小体积的独立可执行程序扫清了道路。
全量垃圾回收摆脱暴力遍历
全量垃圾回收导致的运行卡顿一直是常驻内存型后台服务难以逾越的障碍。1.13 调整了回收策略,将系统镜像与包镜像里的预留对象直接标注为永久已标记。垃圾回收的扫描阶段跳过这些极少释放和修改的内存区域。这种做法实现了一次全量扫描周期的数量级下降,而新生代的增量回收机制则不受此策略调整影响。
在 Apple M4 Pro 处理器的实测数据中,不同量级的内存负载均呈现了显著改善。裸会话的全量 GC 耗时从 35 毫秒砸到了 2 毫秒;挂载 Revise 扩展后的耗时由 50 毫秒降至 11 毫秒;引入 Cthulhu 后由 59 毫秒降至 18 毫秒;引入 PythonCall 桥接由 90 毫秒降至 30 毫秒。即便是庞大的 GLMakie 绘图包,也从 187 毫秒大幅缩减至 68 毫秒。
在向跨迭代保活字典插入 500 万次随机向量的严苛测试中,总耗时从 1.699 秒缩减至 0.566 秒。垃圾回收过程在执行周期中的占比从 79.80% 锐减至 44.32%。不做无用功的内存遍历,比单纯堆砌硬件算力带来的系统级收益更直接。把语言内置对象当成不变的常量对待,高并发后端服务终于能在生产环境中维持更平稳的延迟波形。
线程精准唤醒,基础算法剥离 C 语言
任务调度模型的粒度控制同样迎来了精细化重构。空闲线程如今停留在专用的调度任务中。已结束的任务能被更及时地释放回收,避免了悬空任务导致的无谓资源占用。核心的变化发生在 @spawn 宏的唤醒逻辑上。它现在仅唤醒目标线程池里的一个空闲线程,而不是粗暴地同时唤醒所有可用线程。在 16 核的 Linux 机器上,该改动带来 1.1 到 1.6 倍的性能增益。在 Windows 环境与核数严重超配的集群中,性能增益高达 10 到 300 倍。原定的任务取消机制则顺延至后续的 1.14 规划内。
基础算法的执行组件同样进行了脱离 C 语言的重构。默认的字节哈希算法被替换为 RapidhashNano,覆盖字符串、高精度大整数和有理数等常用数据类型。底层代码整体迁到了纯 Julia 语言编写,针对小定宽数据的混合步骤也换成了单轮 XMX 构造。在纯粹的算法实现层面,流式哈希也不再需要预先知道输入内容的长度(需注意默认哈希种子发生改变,且依然为非密码学安全标准)。处理古腾堡《十日谈》全文这种长字符串时,哈希耗时从 8.555 微秒降到了 1.742 微秒。自定义抽象字符串类型的哈希操作耗时从 204.583 微秒降到 1.750 微秒,且内存分配次数由 21 次降为零。基础组件去 C 语言化,清除了跨语言调用的黑盒开销,编译器获得了更通透的推断优化空间。
终端夺回系统控制权,自省机制获得加强
如果一个交互式环境连键盘中断信号都接不住,执行速度再快也留不住开发者。1.13 重写了调度与中断的接收机制。键盘输入的 Ctrl-C 信号终于能准确打断处于睡眠或文件读写阻塞状态的用户代码。分布式运算的 Distributed.interrupt 恢复了工作。原生命令行能够扛住反复出现以及时机极差的终止指令。语言虚拟机重新接管了操作系统的底层控制权,不再假死到让用户去系统监视器里强制结束进程。
日常的开发交互体验也获得了关键性补齐。原生命令行加入了完备的语法高亮机制,并对 Windows 系统引入了带格式粘贴功能。终端搜索逻辑替换为类似 fzf 的命令历史界面。
图:REPL 语法高亮效果。来源:Julia 官方博客
图:新的 fzf 风格历史搜索。来源:Julia 官方博客
代码自省宏如 @which 和 @code_typed 扩大了识别能力。它们现在直接接受包含类型标注形式的调用表达式,如 @which push!(::Vector{Int}, 1),并且支持了广播操作表达式。开发者能够直接把错误栈里的调用帧连同类型参数复制到控制台进行查阅。这省去了手动还原函数参数堆栈的冗长拼凑。此外,新加入的 --trace-eval 开关能够打印顶层求值的运行进度。在持续集成环境开启 debug 模式会自动激活该参数,这为定位卡死的测试套件提供了探测手段。
在项目生态部署环节,Juliaup 推出了全新的图形化管理界面。复杂的通道配置与底层版本切换都能通过直观的视图点击完成。
图:Juliaup 图形化版本管理器界面。来源:Julia 官方博客
一套屏蔽掉繁杂配置指令的环境管理前台,大幅抹平了跨平台部署时由于权限与路径带来的环境灾难。核心团队通过这次迭代确立了一个清晰的工程准则。底层的峰值算力决定了一门语言的入场资格,而日常开发环节的交互顺畅度与等待时长,决定了开发者愿不愿意将其投入长期的项目实践。
参考链接:
- Julia 1.13 Highlights
- Hacker News 社区讨论