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

欢迎!请参阅关于页面,获取有关如何工作的更多信息。

0 投票
集合

由{{vector-of}}生成的原始向量不支持transients。

core.rrb-vector实现了对原始向量transient的支持。可以通过多种方式获得这种支持transient的原始向量:(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}}。在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: transient,为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: transient,hash缓存,gvec的互操作改进

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

评论者:jafingerhut

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

我没有检查更新此补丁的可能性和难度。有关更新补丁的一些提示,请参阅本页面的“更新旧补丁”部分:http://dev.clojure.org/display/community/Developing Patches

0 投票
by

评论者:michalmarczyk

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

0 投票
by

评论者:bbloom

这可能应该是一个单独的问题,但因为它会影响这个补丁,所以我在这里提到。

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

0 投票
by
_评论者:bbloom_

当前补丁在第762行有一个错误。

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

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

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

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

评论者:michalmarczyk

感谢你的发现!附加了修复过的补丁。(实际上,editableArrayFor还有一个错误,也在这版中修复了。)

0 投票

评论者:michalmarczyk

关于nibbles的gvecs,这似乎可以作为一个独立的工单,基于此工单进行补丁构建吗?

另外,core.rrb-vector可以作为额外功能支持nibbles向量(如果内置的gvec在某个时候支持该功能,可以采用内置gvec的表示形式)。你认为这样做会有用吗?

0 投票
_由michalmarczyk发表的评论_

当然,现在可以用一个包装gvec的长整型向量的单独向量类型来实现nibbles向量,但实现会更复杂。我在想,包装方法和"nibble AM"方法之间会有多大的性能差异……
0 投票
参考:[https://clojure.atlassian.net/browse/CLJ-1416](https://clojure.atlassian.net/browse/CLJ-1416) (由michalmarczyk报告)
...