欢迎!请参见关于页面了解有关如何工作的更多信息。
由{{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
评论者:michalmarczyk
以下是补丁的当前版本(0001-CLJ-1416-transients-hash-caching-for-gvec-Object-met.patch)。它包括一些额外的更改——这里是提交信息
{quote}CLJ-1416:transients、gvec的散列缓存、gvec序列的Object方法
https://github.com/michalmarczyk/clojure/tree/transient-gvec-1.6
以下是包含一些额外互操作相关改进的更新补丁。
新提交信息
{quote}CLJ-1416:transients、散列缓存、gvec的互操作改进
评论者为: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
补丁已更新,可以干净地应用到master版本。
评论者为:bbloom
也许这应该是一个新的工单,但因为它会影响这个补丁,所以我在这里提一下。
ArrayManager接口是一个不完整的抽象。原始gvec代码和新transients代码路径依赖于System/arraycopy,而不是在管理对象上的.arraycopy。这意味着无法创建基于非JVM数组的gvec。或者,在我的情况下,无法创建一个基于长整型数组的nibble gvec。参见https://gist.github.com/brandonbloom/441a4b5712729dec7467
感谢你的发现!已将修复后的补丁附加。事实上,editableArrayFor中还有一个错误也在这个版本中修复了。
至于 nibbles 的 gvec,这能作为一个独立的工单,在其基础上添加补丁吗?
另外,core.rrb-vector 可以支持 nibbles 的向量作为一个额外功能(如果内置的 gvec 以后确实支持此功能,则采用内置 gvec 的表示形式)。你认为这会有用吗?