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版本开始,这会将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的哈希缓存,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序列的迭代器相关方法
  • 引入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代码和新瞬时应用的代码路径依赖于System/arraycopy,而不是依赖管理对象的.arraycopy。这意味着无法创建非JVM数组的gvec。或者,在我的情况下,无法创建由长整数数组支持的十六进制数字的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中确实有一个更多的bug,也已在这个版本中修复。)

0

由:michalmarczyk 评论

至于nibbles的gvecs,这能作为一个单独的票项,基于这个补丁构建一些补丁吗?

另外,core.rrb-vector作为附加功能,可以支持nibbles向量(如果内置的gvec在某个时间点确实支持这个功能,可以使用内置gvec的表示)。你认为这会有用吗?

0
_评论由:michalmarczyk_

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