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

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

0
集合

由{{vector-of}}产生的原始元素向量不支持瞬态。

core.rrb-vector实现了原始元素向量的瞬态支持。可以通过多种方式获取这种瞬态启用向量: '(1) 使用gvec实例作为{{fv/catvec}}(如果发生RRB连接,这并不保证)或{{fv/subvec}}的参数;(2) 将gvec实例传递给{{fv/vec}},自core.rrb-vector 0.0.11版本起,它将简单地用RRB包装器重新包装gvec树;(3) 使用{{fv/vector-of}}而不是{{clojure.core/vector-of}}。作为使支持功能在向量类别间保持一致的一部分努力(关于CLJ-787),gvec的原生支持仍然很有用;gvec也更为简单,并且仍然拥有(并且很可能会维持)性能优势。

此处提供了core.rrb-vector对gvec的瞬态支持移植

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:瞬态,gvec的哈希缓存,gvec的序列对象方法

  • 向gvec添加瞬态支持
  • 为gvec和gvec序列添加哈希{eq,Code}缓存
  • 为gvec序列实现hashCode、equals、toString
    {quote}

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

0

评论者:michalmarczyk

这是一个包含一些额外互操作性改进的更新补丁。

新的提交消息

{quote}
CLJ-1416:对transients、哈希缓存以及gvec的互操作性进行改进

  • 向gvec添加瞬态支持
  • 为gvec和gvec序列添加哈希{eq,Code}缓存
  • 为gvec序列实现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。或者,以我的情况,无法创建由longs数组支持的nibbles gvec。请参阅https://gist.github.com/brandonbloom/441a4b5712729dec7467

0
_评论者:bbloom_

当前补丁在第762行存在错误

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

没有这样的签名,只有这些

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

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

评论者:michalmarczyk

感谢指出!附加的补丁已经修复。(实际上还有另一个bug在editableArrayFor中,也已在本版本中修复。)

0
by

评论者:michalmarczyk

至于nibbles的gvec,这能否作为一个独立的工单,在基于这个工单的补丁上构建呢?

另外,core.rrb-vector可以支持nibbles向量的额外功能(如果内部gvec将来支持此功能,可以采用内置gvec的表示)。你认为这会有用吗?

0
by
评论者:michalmarczyk

当然,nibbles向量可以通过包装一个gvec的长向量实现,但实现会更复杂。我想知道,封装方法和“nibble AM”方法之间的性能差异会怎样...
0
by
参考:https://clojure.atlassian.net/browse/CLJ-1416(由michalmarczyk报告)
...