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

欢迎!请参阅关于页面了解更多关于此操作的信息。

0 投票
Collections分类

由{{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}}。Native支持在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 投票
by

评论人:michalmarczyk

这是补丁的当前版本(0001-CLJ-1416-transients-hash-caching-for-gvec-Object-met.patch)。它包含一些其他更改——以下是提交消息:

{quote}
CLJ-1416:瞬态,gvec的哈希缓存,对象方法为gvec seqs

  • 为gvec添加瞬态支持
  • 为gvec和gvec seqs添加{eq,Code}哈希缓存
  • 为gvec seqs实现hashCode、equals和toString
    {quote}

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

0 投票
by

评论人:michalmarczyk

这是一个包含一些互操作相关改进的更新补丁。

新的提交消息

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

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

评论由:jafingerhut发表

2014年7月5日发布的补丁0002-CLJ-1416-transients-hash-caching-interop-improvement.patch,在2014年8月29日对Clojure进行某些提交之后,已无法干净地应用于最新主分支。在此之前可以干净地应用。

我没有检查更新此补丁的难易程度。有关更新补丁的提示,请参阅本页面上的“更新过时补丁”部分: http://dev.clojure.org/display/community/Developing Patches

0 投票

评论人:michalmarczyk

已将补丁更新为可干净地应用于主分支。

0 投票

评论由:bbloom发表

这可能应该是一个单独的票据,但它将影响此补丁,所以我会在下面提到它

ArrayManager接口是一个不完整的抽象。原始的gvec代码以及新的transients代码路径依赖于System/arraycopy,而不是manager对象上的.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中还有一个错误,也已在本版本中修复。

0 投票

评论人:michalmarczyk

至于 nibbles 的 gvecs,这应该是一个单独的工单,其补丁构建在这个基础上吗?

另外,core.rrb-vector 可以作为额外功能支持 nibbles 的向量(并且如果在某个时候内置的 gvec 开始支持此功能,可以采用内置的 gvec 表示法)。你认为这会很有用吗?

0 投票
评论者:michalmarczyk

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