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的哈希缓存,Object方法 για gvec seqs

  • 为gvec添加了瞬时支持
  • 为gvec和gvec seqs添加了hash{eq,Code}缓存
  • 为gvec seqs实现hashCode, equals, toString
    {quote}

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

0

评论由:michalmarczyk发表

这里是一个包含一些额外互操作性能改进的更新补丁。

新的提交信息

{quote}
CLJ-1416:瞬时,哈希缓存,gvec的互操作改进

  • 为gvec添加了瞬时支持
  • 为gvec和gvec seqs添加了hash{eq,Code}缓存
  • 为gvec seqs实现hashCode, equals, toString
  • 正确实现了gvec和gvec seqs的迭代器相关方法
  • 引入了throw-unsupported和缓存哈希(均被标记为私有)
    {quote}
0
by

评论者: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
by

评论由:michalmarczyk发表

补丁更新后,可以干净地应用到master分支上。

0
by

评论者:bbloom

这可能应该是一个单独的案例,但它会影响此补丁,所以我在这里提到它

ArrayManager接口是一个不完整的抽象。原始的gvec代码以及新的transients代码路径依赖于System/arraycopy,而不是在管理器对象上实现.arraycopy。这意味着不可能创建由非JVM数组支持的gvec。或者,在我的情况下,创建一个由longs数组支持的nibbles gvec。见 https://gist.github.com/brandonbloom/441a4b5712729dec7467

0
by
评论者:bbloom_

当前的补丁在第762行有错误

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

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

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

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

评论由:michalmarczyk发表

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

0

评论由:michalmarczyk发表

至于nibble的gvec,能否另外作为一个支持补丁的单独票?

另外,core.rrb-vector可以支持nibble的vector作为额外功能(如果内置的gvec在某个时候支持此功能,将采用内置gvec的表示)。你认为这会有用吗?

0
_评论者:michalmarczyk_

当然,可以使用单独的vector类型来包装一个long的gvec来实现nibble的vector,但这将更加复杂。我想知道包装方法和“nibble AM”方法之间的性能差异。
0
参考:https://clojure.atlassian.net/browse/CLJ-1416(由michalmarczyk报告)
...