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

欢迎!请访问关于 页面以获取更多关于如何使用本站的信息。

0
集合

由 {{vector-of}} 生成的原始数据向量不支持瞬态。

core.rrb-vector 为原始数据向量实现了瞬态支持。这些瞬态启用的原始数据向量可以通过以下几种方式获得:(1) 作为 {{fv/catvec}}(如果发生 RRB 连接,这一情况并无法保证)或 {{fv/subvec}} 的参数使用 gvec 实例;(2) 将 gvec 实例传递给 {{fv/vec}},从 core.rrb-vector 0.0.11 版本开始,这将为 gvec 树提供一个 RRB 封装;(3) 使用 {{fv/vector-of}} 而不是 {{clojure.core/vector-of}}。在 gvec 中集成原生的支持作为使支持的功能在向量风味之间保持一致的努力的一部分仍然很有用(请参考 CLJ-787);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 的哈希缓存,Object 方法的 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 的互操作改进

  • 为 gvec 添加瞬态支持
  • 为 gvec 和 gvec 序列添加 hash{eq,Code} 缓存
  • 实现 gvec 序列的 hashCode、equals 和 toString
  • 正确实现 gvec 和 gvec 序列的相关迭代器方法
  • 介绍不支持抛出(marked private)和缓存哈希(marked private)。
    {quote}
0
by

评论者:jafingerhut

补丁Patch 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
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行有一个bug

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

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

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

我是通过使用 https://github.com/ztellman/collection-check 发现这个问题的
0
by

评论者:michalmarczyk

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

0

评论者:michalmarczyk

至于 nibbles 的 gvecs,它是否能成为一个独立的工单,基于这个工单构建补丁呢?

另外,core.rrb-vector 可以支持 nibbles 的向量作为额外特性(如果内建的 gvec 有一天支持这个特性,可以采用内建 gvec 的表示)。你认为这会有用吗?

0
评论者:michalmarczyk

当然,目前可以使用一个封装了 gvec 长整型的独立向量类型来实现 nibbles 的向量,但实现会更为复杂。我想想知道在封装方法和 "nibble AM" 方法之间会有什么性能差异...
0
参考:[CLJ-1416](https://clojure.atlassian.net/browse/CLJ-1416) (由 michalmarczyk 报告)
...