|Julia 1.6 有哪些使人眼前一亮的光点?

文章图片

文章图片

Julia 1.6 很可能会成为 Julia 的下一个长期支持(LTS)版本 。 因此 , 我们投入了更多时间来开发这个版本 , 确保未来健康生态系统所需的各种特性能够在该版本中实现 。 此外 , 我们还使用所有已注册的开源软件包对这个版本进行了回归测试 , 并跟踪和解决了相关问题 。 在 Julia 1.6 经过实地测试后 , 大约 1.7 发行版进入稳定状态时 , 我们将最终决定 1.6 是否将成为新的 LTS 版本 。
一:并行预编译
执行一个模块中所有语句的操作通常涉及大量代码的编译 , 因此 Julia 创建了模块的预编译缓存以减少这部分时间开销 。 在 1.6 中 , 这个包预编译操作的速度更快了 , 并且发生在退出 pkg>模式之前 。 之前预编译仅作为单个处理的序列 , 在第一次 using/import 一个软件包时 , 在线性代码加载过程中需要时一对一地预编译依赖项 。
在 1.6 中 , pkg>模式获得了高度并行化的预编译操作 , 该操作在程序包动作后自动调用 , 以使活动环境随时可以加载 。
二:编译时间百分比
这个小更改应该能帮助新手理解 Julia 的一个怪癖:计时宏 @time 和它的冗长伙伴 @timev 现在会说明报告的时间中有多少是花在了编译上
考虑到 Julia 的即时(JIT)/ 超前(JAOT)编译机制 , 第一次运行代码时 , 编译开销通常非常可观 , 而后续调用中可以看到很大的速度改进 。 这个更改会强调这种行为 , 可以作为一种提示 , 同时帮助消除不必要的编译工作(例如过度针对性的代码) 。
三:消除不必要的
Julia 最强大的特性之一就是它的可扩展性:你可以向先前定义的函数添加新方法 , 并对新类型使用先前定义的方法 , 有时 , 这些新实体会迫使 Julia 重编译代码以解决分派中的更改 。 这里分两个步骤:第一 , “过时的”代码被无效化 , 将其标记为不适合使用;第二 , 根据需要将新的方法和类型考虑在内 , 再次从头开始编译代码 。
Julia 的早期版本有些保守 , 在某些情况下 , 分派中没有实际更改 , 却也会让旧代码无效化 。 此外 , 在许多地方 , Julia 及其标准库的编写方式都会破坏 Julia 的类型推断 。 编译器有时仅因为新方法“可能”被应用就被迫让代码无效化 , 于是关于类型的任何不确定性都会放大无效化的风险和频率 。 在 Julia 的旧版本中 , 这些影响加在一起让无效化频频出现:只是加载某些程序包就会导致多达 10% 的 Julia 预编译代码被无效化 。 重编译的延迟有时会让交互会话出现卡顿 。 当 Julia 的程序包加载代码中出现无效化时 , 它也延迟了下一个包的加载 , 那么当 SomePkg 依赖其他包时 , 这就会延长 using SomePkg 的等待时间 。
四:减少编译器延迟
【|Julia 1.6 有哪些使人眼前一亮的光点?】除了让我们的库代码对编译器更友好之外 , 我们也在继续尝试加快编译器本身的速度 。 这仍然是我们面临的主要技术挑战之一 。 在这一版本中没有什么重大突破 , 但是我们确实做了一些适度的改进 , 对方法表数据结构做了优化 。
五:帮助优化包
Julia 1.6 与 SnoopCompile v2.2.0 或更高版本共同提供了用于编译器自省的新工具 , 尤其是(但不仅限于)针对类型推断的用途 , 开发人员可以使用新工具来分析类型推断 , 并确定特定的包实现选项如何与编译时交互 。 早期采用者已使用这些工具降低了首次使用的延迟 , 幅度从百分之几到大部分延迟不等 。
六:二进制加载加速
为包提供可靠的可移植二进制文件是所有包环境都必须面对的一项挑战 , 尽管 Julia
- 狐獴|\非洲精灵\狐獴,毒蝎、眼镜蛇都礼让7分!它有何威名?
- example|重磅:黑五前又有店被封,大卖封店90天后被冻金额仍有2574万!
- 太阳系|825亿公里外!如果外星人飞船来到太阳系,这里最有可能发现它
- 科学家|科学家预言:“未来人类将培育出所有人体器官。”
- 科学家|中国跨越式发展!“人造粮食”研发大获成功,有望解决粮食危机?
- 太空望远镜|即将发射的韦伯太空望远镜有多牛?可以在月球上探测到地球上一只黄蜂的热量特征
- 亚马孙热带雨林|“地球之肺”亚马逊雨林,为什么是人类禁区?到底有多恐怖?
- 世界卫生组织|宇宙有哪些高能事件,你知道吗?
- 杭州|神秘的金属球,能吸收太阳能,还有管风琴音乐,是外星人的杰作?
- 相机|了解眼睛有多神奇:人眼像素高达5.76亿,意味着什么?
