【环球新要闻】Julia 1.9.0 发布,科学计算领域高性能语言

2023-05-11 08:31:49 来源:OSCHINA

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函数,如下所示:

usingProfile 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=,使用户能够设置内存使用限制,之后垃圾收集器 (GC) 将更积极地工作,以清理未使用的内存。

通过指定内存限制,用户可以确保垃圾收集器更主动地管理内存资源,降低内存耗尽的风险。

要使用这个新功能,只需运行 Julia,并在--heap-size-hint标志后面加上所需的内存限制:

julia --heap-size-hint=

替换为适当的值(例如,1G512M)。

这一增强功能在 #45369中引入,在处理内存密集型应用程序时提供更好的控制和灵活性。

排序算法性能

默认排序算法已升级为更具自适应性的排序算法,该算法始终稳定且通常具有最先进的性能,它对于简单的类型和顺序——BitIntegerIEEEFloatChar使用基数排序,它具有与输入大小相关的线性运行时间。这种效果对于Float16尤其明显,它在 1.8 上获得了 3x-50x 的加速。

对于其他类型,默认排序算法在大多数情况下已更改为内部的ScratchQuickSort,它稳定且通常比QuickSort更快,对于内存效率至关重要的情况,可以通过指定alg=QuickSort来覆盖这些新的默认值。

任务和交互式线程池

在 1.9 版本之前,Julia 的任务在所有可用线程上运行,没有任何优先级区别。但是,在某些情况可能希望优先处理某些任务,例如运行心跳、提供交互式界面或显示进度更新。

现在可以在Threads.@spawn时将任务指定为交互式任务:

usingBase.Threads @spawn:interactive f()

可以使用以下命令设置可用的交互式线程数:

julia --threads 3,1

此命令以 3 个“正常”线程和一个交互式线程(在交互式线程池中)启动 Julia。

此功能在#42302中引入,有关更多信息,请参阅手册中有关多线程的部分。

更多内容请查看更新公告:https://julialang.org/blog/2023/04/julia-1.9-highlights/

标签:

珠宝展示