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版本中,这只会将gvec树重新包装在RRB包装器中;(3)使用{{fv/vector-of}}而不是{{clojure.core/vector-of}}。在gvec中本地的支持仍然很有用,作为使支持的功能在各种向量风味中保持一致的努力的一部分(参见CLJ-787的相关内容);gvec更简单,并且仍然具有(并且很可能会保持)性能优势。

core.rrb-vector的transient支持移植到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:transients、gvec的散列缓存、gvec序列的Object方法

  • 为gvec添加了transient支持
  • 为gvec和gvec序列添加了hash{eq,Code}缓存
  • 实现hashCode、equals、toString for gvec序列
    {quote}

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

0

评论者:michalmarczyk

以下是包含一些额外互操作相关改进的更新补丁。

新提交信息

{quote}
CLJ-1416:transients、散列缓存、gvec的互操作改进

  • 为gvec添加了transient支持
  • 为gvec和gvec序列添加了hash{eq,Code}缓存
  • 实现hashCode、equals、toString for gvec序列
  • 正确实现gvec和gvec序列的迭代器相关方法
  • 引入了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。或者,在我的情况下,无法创建一个基于长整型数组的nibble 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 的 gvec,这能作为一个独立的工单,在其基础上添加补丁吗?

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

0
by
_评论人:michalmarczyk_

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