朱莉娅1.6亮点

2021-03-26 20:03:49

朱莉娅版本1.6已发布。大多数朱莉娅发布都是定时的,因此没有计划在特定的特征上计划,但此版本是一个例外,因为它可能成为朱莉娅的下一个长期支持(LTS)释放。因此,我们需要额外的时间开发释放,以确保生态系统未来健康所需的功能使其成为释放。此外,对所有注册开源包的回归测试了释放,并跟踪了问题并修复了问题。关于Julia 1.6是否将成为新LTS的最终决定将在该领域进行战斗后,在1.7释放进入稳定的时间之后进行。可以在新闻文件中找到完整的更改列表,但在这里我们' LL更深入地概述了一些发布亮点。

执行模块中的所有语句通常涉及编译大量代码,因此朱莉亚创建模块的预编译缓存以减少此时间。在1.6中,在您离开PKG&gt之前,这种包装的预编译更快,并发生在......模式。到目前为止,预编译完全是单独的序列,在第一次使用/导入的线性代码加载过程期间逐一地预先编译依赖性。

_ = 1.5的古老天,以例子为例;一种具有特别大量依赖性的流行包:

在1.6,pkg>模式在包动作后自动调用的大量并行化的预编译操作,以保持有效环境准备好加载。

(v1.6)pkg>添加差异化......预编译项目......进度[====================================== ==>] 112/112112依赖性在72秒«julia&gt中成功预编译; @Time使用SuperfiaLequations 4.995477秒......

虽然之前的代码加载预编译过程需要〜8分钟,但在没有指示进展的情况下预先编译和加载差异,但新机制需要超过1分钟才能通过依赖项显示进展。然后,第一次加载包装时,它会以全速加载。新的并行预编译过程采用了清单中通过依赖树的深度第一方法,首先在没有依赖项的软件包中,向环境的Project.Toml中列出的软件包,允许多个包在其中预先编译同时。操作是多个处理的,而不是多线程,因此不受朱莉娅的线程计数的限制。默认情况下,Julia将立即产生最大的CPU平衡加载Packpile Proppile作业,基于CPU核心的数量。预编译期间的错误只会投掷项目中列出的软件包,以允许可以在清单中列出但未加载的依赖项,而自动预编译过程将记住如果包在给定的环境中错误,则不会在其更改之前重试。通过设置环境变量Julia_pkg_precompile_auto = 0,可以用Ctrl-C和禁用自动预编译和禁用。

对于正在开发的软件包,鉴于其代码将由其他机制更改,而不是PKG,此新工作流程不会自动避免遇到标准的码加载时间预编译。但是,这些包的非开发依赖性将保留准备好加载,因此负载时间下的顶级预编译应为dev-ed包保持较低。

一个小的变化,应该有助于了解新人的Julia怪人之一的是,定时宏@Time及其冗长的朋友@Timev现在报告了任何报告的时间是否已在编译中。 [1]

朱莉娅> x =兰特(10,10);朱莉娅> @time x * x; 0.540600秒(2.35米分配:126.526 MIB,4.43%GC时间,99.94%编译时间)Julia≫ @time x * x; 0.000010秒(1分配:896字节)

鉴于Julia的时间(JIT)/超前于时间(JAOT)编译,第一次代码运行编译开销通常很大,在后续呼叫中看到了大的速度改进。此更改突出显示该行为,作为提醒和用于植根于不需要的编译工作的工具,即over专用代码。

[1]请注意,在某些情况下,系统将在@time表达式中查找并在执行顶级表达式之前编译一些被叫的代码。发生这种情况时,不会计算一些编译时间。包括此次您可以运行@emal @eval ...

Julia最强大的功能之一是其可扩展性:您可以将新方法添加到先前定义的函数中,并在新类型上使用先前定义的方法。有时,这些新实体强制朱莉娅重新编译代码以解释派遣的变化。这发生在两个步骤:首先,“过时”代码无效,将其标记为不适合使用;其次,根据需要,代码再次从划痕编译,考虑到新方法和类型。

早期版本的朱莉娅有些保守,并且在某些情况下没有派遣的情况下旧的代码无效。此外,有许多地方,朱莉娅及其标准文库是以击败朱莉娅的类型推理的方式编写的。因为编译器有时不得不使代码无效,因为只要一个新的方法可能适用,所以类型的任何不确定性都会放大无效的风险和频率。在旧版本的朱莉娅中,这些效果的组合使得失效普遍存在:只是加载某些软件包导致高达10%的Julia的预编码的失效。重新编译的延误有时会使互动会话感到迟钝。当Julia的包装代码中发生了失效时,它也会延迟加载下一个包,当Somepkg取决于其他包时,它会随时使用Somepkg。

在1.6中,为旧代码无效的方案已经做出更准确和选择性。此外,朱莉娅及其标准图书馆接受了彻底的改造,以帮助型推断频繁地达到一个具体答案。结果是一种瘦,朱莉娅更快地对方法无效更不受欢迎,并且在互动会话中感觉更敏感和灵活。相关博客文章:分析Julia的编译器延迟:方法失效。

除了让我们的图书馆代码更加编译,我们继续尝试加快编译器本身。这仍然是我们主要的技术挑战之一。在这个释放中,没有任何重大突破,但我们确实有一些适度的改进,因为在方法表数据结构上工作。

方法特异性是部分顺序,并在1.6之前以排序顺序存储方法。我们还试图确定插入的模糊方法,希望避免为每个未来查询重复工作。不幸的是,排序部分顺序需要二次时间,并且这次在封装加载期间开始突出显示(当需要插入当前活动的方法表时)。

通过使流程Lazier,将分类和歧义检测转变为查找匹配方法的算法来改进。这种算法经常运行,因此这一变化将有所帮助。但关键是绝大多数查询是针对具体的足够特定类型,可以轻松地消除大多数可能的匹配,使许多输入较少的输入到最昂贵的步骤。

此处的主要可见改进是打包加载,从解决无效的增长顶部增加一系列额外速度。

在精炼我们推断的质量特征方面取得了实质性的努力,这两者都在停止分析时,当它被认为不具有益处,并尽可能提取更精确的信息。这方面的两侧都可以对复杂的代码具有显着的好处,例如绘图库,该文库超过大量不同的配置选项。

除了更新Julia版本外,如果更新Julia Version,则应简单地使用以下大部分益处要进一步实现,现在还有一个用于分析编译时间的一般框架,用于调查哪些函数贡献最大的执行延迟。其他人更详细地描述了这一点。但是,通过每个版本,您可能只是发现旧的代码模式,您曾经需要避免性能,现在工作很好!

我们也将许多微优化应用于几个内部数据结构。这些再次赢得了' t影响您的代码的工作原理,但应该改善它如何动态执行。例如,Invokelatest现在比尝试更快,几乎和动态调度一样快。几种具有树木的复杂内部数据结构也变成了简单的哈希表,改善了它们的缩放性能,使它们更便宜的线程安全。这会影响某些关键区域,例如类型分配(Apply_type和元组),方法优化查找(方法静态)和调度(JL_APPLY_GENERIC)。

Warning: Can only detect less than 5000 characters

这很慢。为每个下载启动新过程是昂贵的;但更糟糕的是,这些进程无法共享TCP连接或重复使用已经协商的TLS连接,因此每个下载都需要进行TCP SYN / ACK歌曲和舞蹈,然后也可以进行TLS秘密握手,所有这些都需要大量的时间。

这是不一致的。由于下载的确切方式取决于系统上安装的事情,因此下载行为非常不一致。在一个系统上的下载可能无法在另一个系统上运行。此外,有人可能拥有的任何问题,不可避免地结束了朱莉娅修复的范围 - 典型的答案是"修复你的系统卷曲/ wget /无论如何,"这对使用朱莉娅只想能够下载东西的人来说不是一个非常令人满意的解决方案。

它是不灵活的。下载的核心要求很简单:URL IN,文件OUT。但也许您需要通过请求传递一些自定义标题。或者也许您需要查看返回的标题。通常您要显示大型下载的进度。一些下载命令具有其中一些的选项,但我们只能支持所有下载方法支持的选项,这已强制下载是相当不灵活的。

在Julia 1.6中,所有下载都通过Libcurl-7.73.0通过新的下载.jl标准库完成。下载是在过程中完成的,并共享和重用TCP + TLS连接。如果服务器支持HTTP / 2,甚至可以将多个请求复用到同一HTTPS连接上。所有这一切都意味着下载更快。

由于所有朱莉娅用户现在使用相同的方法来下载东西,如果它在一个系统上工作,那么它就更有可能在任何地方工作。没有更多破碎的下载,因为系统卷曲恰好真的很旧。和libcurl是高度可配置的:我们可以通过请求传递自定义标题,看看响应中包含哪些标题,并获取下载进度 - 以相同的方式到处都是相同的。

作为重新加工下载的一部分,我们已经切换到麦斯科斯芯片和Windows上的内置TLS堆栈,这允许下载使用内置机制来通过系统的证书颁发机构根证书的集合来验证TLS服务器的标识(“ CA ROOS“短暂)。在Linux和FreeBSD上,我们现在还可以查看带有CA根证书的PEM文件的标准位置。使用系统CA根证书的优点是大多数系统将自动将这些CA ROOTS保持在Windows和Windows上,并且在执行证书验证时,操作系统将检查撤销的证书(Linux是否具有标准方法去做这个)。朱莉娅本身仍然用一个合理最新的CA Roots船只船只,但除非找不到系统CA Roots,否则我们不再使用它。

使用系统CA Roots已经意味着朱莉娅将从防火墙后面“正常工作”更有可能。许多机构防火墙将为中间(MITM)您的外向HTTPS连接,并为客户端连接提供服务器的伪造HTTPS证书。为了使其在客户端上设置安全警报,它们通常将私有CA根证书添加到用户' S系统,以便您的浏览器将接受防火墙的伪造证书。由于Julia现在使用系统的CA ROOTS,因此它尊重已添加的任何私人CA根。

如果这不起作用,Julia 1.6还介绍了NetworkOptions.jl stdlib:此程序包作为网络配置选项的中心位置,可以由各种环境变量控制,并且用于修改网络库的行为像libcurl和libgit2以一致的方式。例如,如果要完全关闭HTTPS主机验证,您可以做导出Julia_ssl_no_verify_hosts =" **"在您的shell中,下载和libgit2包在下载时,在下载时不会执行https的主机验证。网络选项中提供了各种其他选项,包括:

Julia _ * _ verify_hosts用于细粒度控制的变量,或者不应该在各种运输中验证哪些主机,包括TLS和SSH

现在,这些选项始终如一地尊重与Julia本身的所有网关代码持续尊重,我们将与包开发人员合作,以鼓励他们使用NetworkOptions进行库的配置,例如MedTLS等。这将允许整个Julia生态系统中的网络选项配置。

此释放周期我们花了很多时间以持续的整合(CI)流程中间歇测试故障的形式支付技术债务。与这些天的所有负责软件项目一样,我们为每一个提交和每一个提出的建议进行全面构建和测试套件

......