Julia 编程语言 1.9 版本已发布,这是一种通用的高性能语言,在科学计算和数值分析中较为流行。Julia 1.9 是 1.x 系列版本中的第九个次要版本,添加了一些新特性和功能,主要更改如下:
本机代码的缓存
本机代码缓存现已可用,从而显着改善了 TTFX (首次执行时间 )延迟,包作者现在可以利用带有 PrecompileTools 的precompile
语句或工作负载来提前缓存重要的例程。
用户还可以创建自定义本地“启动”包,以加载依赖项并预编译适合其日常工作的工作负载。此功能带来一些额外的负载,例如预编译时间增加 10%-50%,但这是一次性成本。由于存储更多数据和使用不同的序列化格式,缓存文件也变得更大。
下图说明了从 Julia 1.7 开始加载时间 (TTL)、TTFX 和缓存文件大小的变化:
包扩展
Julia 1.9 引入了“包扩展”,从广义上讲,这是一种在加载一组包时自动加载模块的功能。该模块包含在ext
父包目录中的一个文件中,加载“弱依赖”和扩展方法。
包扩展提供的功能类似于 Requires.jl 已经提供的功能,但具有关键优势,例如允许预编译条件代码,和添加弱依赖性的兼容性约束。
ForwardDiff.jl 包提供了优化的示例,在 Julia 1.8 中它无条件加载StaticArrays
包,而在 1.9 中,它使用包扩展缩短加载时间:
# 1.8 (StaticArrays unconditionally loaded)
julia> @time using ForwardDiff
0.590685 seconds (2.76 M allocations: 201.567 MiB)
# 1.9 (StaticArrays not loaded)
julia>@time using ForwardDiff
0.247568 seconds (220.93 k allocations: 13.793 MiB)
有关使用包扩展的综合指南,请参阅文档。
堆快照
现在可以生成可以使用 Chrome DevTools 检查的堆快照。
要创建堆快照,只需使用Profile
包并调用take_heap_snapshot
函数,如下所示:
using Profile Profile.take_heap_snapshot("Snapshot.heapsnapshot")
如果对对象的数量更感兴趣,则可以使用该all_one=true
参数。这会将每个对象的大小报告为一个,更容易识别保留的对象总数。
Profile.take_heap_snapshot("Snapshot.heapsnapshot", all_one=true)
要分析堆快照,请打开 Chromium 浏览器并按照以下步骤操作right click -> inspect -> memory -> load
:上传您的.heapsnapshot
文件,左侧将出现一个新选项卡以显示快照的详细信息。
GC 的内存使用提示--heap-size-hint
Julia 1.9 引入了一个新的命令标志--heap-size-hint=<size>
,使用户能够设置内存使用限制,之后垃圾收集器 (GC) 将更积极地工作,以清理未使用的内存。
通过指定内存限制,用户可以确保垃圾收集器更主动地管理内存资源,降低内存耗尽的风险。
要使用这个新功能,只需运行 Julia,并在--heap-size-hint
标志后面加上所需的内存限制:
julia --heap-size-hint=<size>
替换<size>
为适当的值(例如,1G
或512M
)。
这一增强功能在 #45369中引入,在处理内存密集型应用程序时提供更好的控制和灵活性。
排序算法性能
默认排序算法已升级为更具自适应性的排序算法,该算法始终稳定且通常具有最先进的性能,它对于简单的类型和顺序—— BitInteger
、 IEEEFloat
和 Char
使用基数排序,它具有与输入大小相关的线性运行时间。这种效果对于 Float16
尤其明显,它在 1.8 上获得了 3x-50x 的加速。
对于其他类型,默认排序算法在大多数情况下已更改为内部的 ScratchQuickSort
,它稳定且通常比 QuickSort
更快,对于内存效率至关重要的情况,可以通过指定 alg=QuickSort
来覆盖这些新的默认值。
任务和交互式线程池
在 1.9 版本之前,Julia 的任务在所有可用线程上运行,没有任何优先级区别。但是,在某些情况可能希望优先处理某些任务,例如运行心跳、提供交互式界面或显示进度更新。
现在可以在 Threads.@spawn
时将任务指定为交互式任务:
using Base.Threads @spawn :interactive f()
可以使用以下命令设置可用的交互式线程数:
julia --threads 3,1
此命令以 3 个“正常”线程和一个交互式线程(在交互式线程池中)启动 Julia。
此功能在 #42302 中引入,有关更多信息,请参阅手册中有关多线程的部分。
更多内容请查看更新公告:https://julialang.org/blog/2023/04/julia-1.9-highlights/