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}}。在 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 序列添加 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 序列的相关迭代器方法
  • 介绍 throw-unsupported 和缓存哈希(均标记为私有)
    {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。或者,就我而言,要创建由长数组支持的 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

感谢指出错误!已修复的补丁已附加。实际上,editableArrayFor 也有一个错误,也在这个版本中修复了。)

0
by

评论者:michalmarczyk

至于 nibbles 中的 gvecs,这能作为一个单独的工单,基于此工单添加补丁吗?

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

0
by
_评论者:michalmarczyk_

当然,可以使用一个单独的向量类型将 longs 的 gvec 包装起来以实现 nibbles 的向量,但这将需要更多的实现。我想知道包装方法和 "nibble AM" 方法之间会有怎样的性能差异...
0
by
参考:[链接地址](https://clojure.atlassian.net/browse/CLJ-1416)(由 michalmarczyk 报告)
...