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

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

0
收集

使用{{vector-of}}产生的原始数据向量不支持转瞬态。

core.rrb-vector实现了对原始数据向量的转瞬态支持。可以通过以下几种方式获取这类带转瞬态支持的原始数据向量:(1)将gvec实例作为{{fv/catvec}}的参数(如果发生RRB连接,这并不保证)或{{fv/subvec}}; (2)将gvec实例传递给{{fv/vec}},从核心.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

将很快将其更新到当前主版本。

请参阅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序列添加了hash{eq,Code}缓存
  • 实现了gvec序列的hashCode、equals、toString方法
    {quote}

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

0

评论人:michalmarczyk

这是一个更新的补丁,其中包括一些额外的互操作相关改进。

新的提交信息

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

  • 为gvec添加了转瞬态支持
  • 为gvec和gvec序列添加了hash{eq,Code}缓存
  • 实现了gvec序列的hashCode、equals、toString方法
  • 正确实现了gvec及其序列的迭代器相关方法
  • 引入了throw-unsupported和缓存哈希功能(均标记为私有)
    {quote}
0

评论者:jafingerhut

2014年7月5日的补丁0002-CLJ-1416-transients-hash-caching-interop-improvement.patch在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的gvec,这能否作为一个单独的工单,基于这个工单进行补丁构建呢?

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

0
评论者:michalmarczyk

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