Data+AI时代,如何打造下一代数智平台? 了解详情
写点什么

加入 Transients 和 Chunked Sequences 的 Clojure 1.1 更加高效

  • 2009-12-27
  • 本文字数:2104 字

    阅读完需:约 7 分钟

Clojure 1.1 RC1 已经发布——现在是介绍它的时候了,我们希望能够在最终版发布之前给出一些反馈。这些工作是在 GitHub 的 Clojure 1.1 分支上完成的,现在在 Google Code 上已经可以下载到 Clojure 1.1 RC1 的 Binary Package 了。

1.1 的更新日志列出了和 1.0 的不同点,例如在 1.1 发布之前已经关闭的 issue 。同样也加入了一些新的特性来优化 Clojure 程序的性能。

Transients能够大幅改善构建持久数据结构的性能。持久数据结构是Clojure 非常重要的元素,例如隐藏在Clojure 的Vectors,Maps 和Sets(参考Clojure 创建者 Rich Hickey 关于持久数据结构的介绍)后面的细节和概念。简而言之,持久数据结构是非可变的;要删除或者修改数据的唯一办法就是复制一份此数据结构的副本。但是有一个小技巧:持久数据结构的内部结构以及它的性质(所有元素都是不可变的)允许共享所有的数据和大部分结构,因此创建一个拷贝只需要非常小的开销。

虽然复制副本的开销很小,但是也会有需要插入大量元素的情况出现。Transients也可以解决这种情况。简单来说,这种思想就是在大量修改之前将一个持久数据结构转换为一个 transient;调用 transient 即可完成这个功能。同一数据结构的 transient 版提供了和持久版相同的存取函数,但是对于修改操作来说,这就需要使用后缀为“!”的不同函数了,例如 conj!(而不是 conj)。

理解持久数据结构和他们的 transient 版本的关系的一个好办法是看看 java.lang.String 和 java.lang.StringBuilder 之间的关系;一个是不可变的,当需要修改的时候它会创建一个新的副本,而另一个则允许直接在其上进行修改。

不过它们的相似性也就这些。但是,创建一个 StringBuilder 也就意味着拷贝 String 的内容,一个 O(n)的操作。将持久数据结构转换为等价的 transient 版本的开销却非常小:只是一个 O(1)的操作;它只是创建了一个 transient 的对象,这个对象包括了一个数据结构的根对象,然后还有一个表示其为 transient 的标记;不会有数据复制的行为。一旦数据结构的 transient 版本需要转换为持久版,同样也只需要 O(1)的操作。

但是为什么有时候需要将持久版转回为 transient 版呢?难道不能无限制地使用 transient 吗?当然不能 - transient 版本有一个非常重要的限制:它只能被一个线程使用。原因很简单:因为 transient 是可变的,在不同的线程中使用它将会非常危险的,所以需要同步。而持久数据结构使得在线程间共享数据结构变得非常简单;transient 允许一个线程修改数据结构,然后通过将其转换为持久数据结构置为其他线程可访问。

Chunked Sequences是 Clojure 1.1 中的另外一个优化。快速预览可以看 Rich Hickey 关于 chunked sequence 演讲的幻灯片(PDF 格式)。

chunked sequences 背后的思想即是减少由于(lazy)sequences 引入的开销。

Lazy sequences 在 Clojure 中随处可见,它能够延迟某个任务直到必须要去做的时候。但是在某些情况下,有些任务根本不需要做,例如下列代码:

复制代码
(take 10 (range 1 1000000000000) )

range 创建了一个 lazy sequence,这个 lazy sequence 会预生成好指定范围内的 10 个数。然后,take 会请求 10 次 sequence 来获取生成的数。由于使用 lazy 方法,这只是请求了 10 个数而已,因为预处理,所以总共只需计算 10 个数。

实现使用了 lazy-seq 宏(在 core.clj 中),这样使得代码非常简洁。但是有一个问题:在 lazy sequence 中访问下一个元素可能会有一些数据管理上的开销。Chunked sequences 即是为了减少这样的开销而生的,它将元素划分成多个块并且缓存值;块的大小是 32,也就是说每一步的开销只是限定在 32 个元素之内。

另外一种优化 chunked sequences 的方法是对数据结构内部组织结构分析。例如,一个持久 vector 是以树的形式组织的,在这里面数据保存在 32 个元素数组中。为了访问一个元素,需要遍历这棵树来寻找到元素保存的数组。一个原生的 sequence 使用索引访问下一个元素,这样可能导致每次访问的时候都需要遍历树。chunked sequence 的持久 vector 实现避免了这种情况:它找到 sequence 开始的存储有 32 个元素的数组,然后为每个元素快速建立一个简单索引;只有在 32 个元素都访问之后,才需要取下一个树节点并且开始遍历。

现在就只是看看 chunked sequences 的接受度如何了;它们显然有着很大的优点,但是 Clojure 1.1 更新日志指出:

chunked-seq 的开销和其他 sequence 一样都是完全透明的。但是,注意有些 sequence 一次会处理超过 32 个元素。如果你依赖于完全惰性(full laziness),不希望学习如何生成任何零成本的结果,那么当然可能对你有影响。一个将开销限制在单个元素的 chunked-seq 的接口仍然在设计中,请将 chunked sequence 在实际应用中出现的问题或者行为差异反馈给我们。

当然 Clojure 1.1 还有更多特性仍待介绍,更多信息请参考 Clojure 1.1 更新日志

如果需要更多关于 Clojure 的信息,请点击 InfoQ 的 Clojure 标签。强烈推荐 Rich Hickey 的演讲,例如持久性数据结构和已托管的引用。InfoQ 同样也有在 QCon London 2009 上采访 Rich Hickey 的视频

查看英文原文: Clojure 1.1 Adds Transients, Chunked Sequences for Efficiency

2009-12-27 05:171746
用户头像

发布了 90 篇内容, 共 36.8 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

Sketch中文版 v101是一款专为设计师打造的矢量绘图设计工具

Rose

AI工具百宝箱|GenFM on ElevenReader,支持32种语言的AI播客,等你来体验

可信AI进展

优化数据库管理,Navicat for MySQL助你一臂之力

Rose

商机库系统(源码+文档+部署+讲解)

深圳亥时科技

淘宝商品详情接口(Taobao.item_get)丨淘宝API接口指南

tbapi

淘宝API接口 淘宝商品详情接口

CST软件如何截取部分封装或者PCB进行仿真

思茂信息

仿真软件 cst 有限元

质量度量落地的注意事项和思考

老张

软件测试 质量保障 质量度量

mac电池健康守护者:coconutBattery Plus,精准监控您的设备电量!

Rose

云交易技术对接全景

京东科技开发者

智慧厕所系统的核心特点、应用场景和未来趋势

光明源智慧厕所

AI浪潮下,从英伟达GPU看全球芯片市场能否撬动黄金和石油的传统地位?

GPU算力

gpu 芯片 英特尔 GPU 集群 gpu 算力

到底选谁?五大多智能体 ( Multi-AI Agent) 框架对比

Baihai IDP

AI LLMs AI Agents 多智能体框架

打造梦想花园,Garden Planner助你一臂之力!

Rose

用AI“读懂”专业文档资料,合合信息助力出海企业规避侵权“陷阱”

合合技术团队

人工智能 AI 企业出海 文档解析

Mac GIT客户端 SourceTree激活码 免登陆版

Rose

七牛云荣登 36 氪「WISE2024 商业之王年度最具商业价值企业」榜单

七牛云

七牛云与 openEuler 完成兼容互认证

七牛云

CAD建模软件BricsCAD 24:性能升级,设计无界

Rose

COC云运维中心新特性解读,让智能运维更高效

华为云开发者联盟

云运维 AOM 确定性运维

11.11大促背后的技术保障:SLA与SLO的深度解析与实践案例

京东科技开发者

智慧厕所系统,现代化便民服务的新标杆

光明源智慧厕所

AutoCAD 2019中文版(附cad2019安装教程图解)

Rose

StarRocks存算分离在得物的降本增效实践

得物技术

数据库 开源 后端 OLAP

XLD音频无损解码 X Lossless Decoder for mac中文直装版

Rose

突破传统开发瓶颈:AI赋能下的低代码平台如何助力业务创新?

天津汇柏科技有限公司

低代码平台 AI 人工智能

自己写插件-实现时间戳自由

京东科技开发者

经济下行,利润却翻倍!AI救了这些企业的命

禅道项目管理

人工智能 项目管理 企业转型 项目管理软件 AI落地

威睿能源:全面布局绿色储能,助力全球能源转型

科技热闻

领取云主机,带你基于PyTorch构建高效手写体识别系统

华为云开发者联盟

图像识别 云主机 PyTorch AI 基础设施

从人员外包到测试工具、测试平台,提供全方位的测试解决方案

测试人

软件测试

KG+RAG 系列范式对比及 KAG 框架再思考:兼看大模型增强 KBQA 问答竞赛方案

可信AI进展

加入Transients和Chunked Sequences的Clojure 1.1更加高效_Java_Werner Schuster_InfoQ精选文章