欢迎!请参阅关于页面,获取有关如何工作的更多信息。
由{{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版开始,这将在RRB包装器中简单地重新包装gvec树;(3) 使用{{fv/vector-of}}而不是{{clojure.core/vector-of}}。在gvec中实现原生的支持对于使支持的功能在向量类型之间保持一致很有用(有关CLJ-787,请参阅此处的相关信息);gvec也更简单,并且仍然具有(并可能保持)性能优势。
core.rrb-vector对gvec的transient支持的移植在此处可用
https://github.com/michalmarczyk/clojure/tree/transient-gvec
我将很快将其更新到当前的master分支。
有关一些基准,请参阅clojure-dev线程
https://groups.google.com/d/msg/clojure-dev/9ozYI1e5SCM/BAIazVOkUmcJ
评论者:michalmarczyk
这是当前补丁版本(0001-CLJ-1416-transients-hash-caching-for-gvec-Object-met.patch)。它包括一些额外的更改——以下是提交信息
{quote}CLJ-1416: transient,为gvec添加hash缓存和Object方法
https://github.com/michalmarczyk/clojure/tree/transient-gvec-1.6
这是带有一些额外互操作改进的更新补丁。
新的提交信息
{quote}CLJ-1416: transient,hash缓存,gvec的互操作改进
评论者:jafingerhut
补丁0002-CLJ-1416-transients-hash-caching-interop-improvement.patch在2014年7月5日之前不会再干净地应用到最新的master分支上,因为在对Clojure进行了一些提交后(2014年8月29日)。在那一天之前它是可以干净应用的。
我没有检查更新此补丁的可能性和难度。有关更新补丁的一些提示,请参阅本页面的“更新旧补丁”部分:http://dev.clojure.org/display/community/Developing Patches
补丁已更新,可干净地应用到master分支。
评论者:bbloom
这可能应该是一个单独的问题,但因为它会影响这个补丁,所以我在这里提到。
ArrayManager接口是一个不完整的抽象。原始gvec代码和新transients代码路径都依赖于System/arraycopy,而不是manager对象的.arraycopy。这意味着无法创建由非JVM数组支持的gvec。或者,在我的情况下,无法创建由longs数组支持的nibbles gvec。请参阅https://gist.github.com/brandonbloom/441a4b5712729dec7467
感谢你的发现!附加了修复过的补丁。(实际上,editableArrayFor还有一个错误,也在这版中修复了。)
关于nibbles的gvecs,这似乎可以作为一个独立的工单,基于此工单进行补丁构建吗?
另外,core.rrb-vector可以作为额外功能支持nibbles向量(如果内置的gvec在某个时候支持该功能,可以采用内置gvec的表示形式)。你认为这样做会有用吗?