2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于如何使用本站的信息。

0
集合

由 {{vector-of}} 产生的原始数据向量不支持 transient。

core.rrb-vector 实现了对原始数据向量的 transient 支持。可以通过多种方式获得这种启用了 transient 的原始数据向量:① 使用 gvec 实例作为 {{fv/catvec}}(如果发生 RRB 连接,这是未经保证的)或 {{fv/subvec}} 的参数;② 将 gvec 实例传给 {{fv/vec}},从 core.rrb-vector 0.0.11 版本开始,这将从 RRB 包装器中重新包装 gvec 树;③ 使用 {{fv/vector-of}} 代替 {{clojure.core/vector-of}}。在 gvec 中仍然具有原生支持,这是在使支持的功能跨向量类型一致的过程中的一部分(参看 CLJ-787);gvec 更简单,并且仍然具有(并可能会维持)性能优势。

core.rrb-vector 对 gvec 的 transient 支持可在此处获得

https://github.com/michalmarczyk/clojure/tree/transient-gvec

我将在不久的将来的将它们更新至当前 master 版本。

请参阅 clojure-dev 线程以获得一些基准测试

https://groups.google.com/d/msg/clojure-dev/9ozYI1e5SCM/BAIazVOkUmcJ

10 个答案

0

评论者:michalmarczyk

以下是补丁的当前版本(0001-CLJ-1416-transients-hash-caching-for-gvec-Object-met.patch)。它包括一些额外的更改——以下是提交消息:

{quote}
CLJ-1416:transients,gvec 的 hash 缓存和 Object 方法

  • 为 gvec 添加 transient 支持
  • 为 gvec 和 gvec seqs 添加 hash{eq,Code} 缓存
  • 为 gvec seqs 实现了 hashCode、equals、toString
    {quote}

https://github.com/michalmarczyk/clojure/tree/transient-gvec-1.6

0

评论者:michalmarczyk

以下是一个包含一些与互操作相关改进的更新补丁。

新的提交消息:

{quote}
CLJ-1416:transients,hash 缓存,gvec 的互操作改进

  • 为 gvec 添加 transient 支持
  • 为 gvec 和 gvec seqs 添加 hash{eq,Code} 缓存
  • 为 gvec seqs 实现了 hashCode、equals、toString
  • 正确实现 gvec 和 gvec seqs 的迭代器相关方法
  • 引入 throw-unsupported 和 caching-hash(都标记为私有)
    {quote}
0

评论者:jafingerhut

补丁 0002-CLJ-1416-transients-hash-caching-interop-improvement.patch(2014年7月5日创建)在2014年8月29日对Clojure进行了一些提交后,不再干净地应用到最新的master分支。在那之前,它是可以干净地应用的。

我还没有检查更新此补丁可能有多简单或复杂。请参阅本维基页面的“更新过时的补丁”部分,以获取有关更新补丁的提示:http://dev.clojure.org/display/community/Developing Patches

0

评论者:michalmarczyk

补丁已更新并干净地应用到master分支。

0

评论者:bbloom

也许这应该是一个单独的工单,但它会影响此补丁,所以我在这里提到这一点

ArrayManager接口是一个不完整的抽象。原始的gvec代码以及新的transients代码路径依赖于System/arraycopy,而不是对象上的.arraycopy。这意味着无法创建由非JVM数组支持的gvec。或者,在我的情况下,无法创建由long数组支持的nibbles gvec。参见 https://gist.github.com/brandonbloom/441a4b5712729dec7467

0
_评论者:bbloom_

当前补丁在第762行有bug

    (let [node ^clojure.core.VecNode (.ensureEditable this node)

没有这个签名,只有这些

  (ensureEditable [this]
  (ensureEditable [this node shift]

我使用 https://github.com/ztellman/collection-check 发现了这个问题
0

评论者:michalmarczyk

谢谢指出!附件中固定了补丁。(实际上,editableArrayFor中还有一个bug,也已经在本版本中修复。)

0

评论者:michalmarczyk

关于 nibbles 的 gvecs,这能作为一个单独的工单,在上述工单基础上进行补丁构建吗?

另外,core.rrb-vector 可能可以通过新增功能支持 nibbles 的向量,并采用内建 gvec 的表示法(如果内建的 gvec 今后支持此功能)。您认为这会很有用吗?

0
_由 michalmarczyk 发布的评论_

当然,今天可以实现在 gvec 长整型向量上包装一个单独的向量类型来支持 nibbles 的向量,但实现会更加复杂。我很好奇包装方法和“nibble AM”方法之间会有怎样的性能差异……
0
参考: https://clojure.atlassian.net/browse/CLJ-1416(由 michalmarczyk 报告)
...