exp*_*ite 6 java enumeration scala bitset scala-collections
我在相当高吞吐量的设置中使用Scala Enumeration ValueSet - 创建,测试,联合和交叉约10M /秒/核心.我没想到这会是一个大问题,因为我曾经读过他们得到BitSets支持的地方,但令人惊讶的是,ValueSet.isEmpty在与YourKit的分析会话中出现了热点.
为了验证,我决定尝试使用Java BitSet重新实现我需要的东西,同时尝试保留使用Scala Enumerations的一些类型安全性.(代码审查转移到https://codereview.stackexchange.com/questions/74795/scala-bitset-implemented-with-java-bitset-for-use-in-scala-enumerations-to-repl)好消息是,将我的ValueSets更改为这些BitSet确实减少了25%的运行时间,因此我不知道ValueSet在引擎盖下的确做了什么,但它可以改进......
编辑:查看ValueSet源似乎表明isEmpty肯定是O(N),使用通用SetLike.isEmpty实现. 考虑到ValueSet是用BitSet实现的,这是一个错误吗?
编辑:这是分析器的回溯.这似乎是一种在bitset上实现isEmpty的疯狂方法.

根据记录,我完全赞成深入了解底层,但这种设计对任何凡人编码员的要求太多了。
当然,神仙们有无限的时间可以支配。
Enumeration.ValueSet由 a 支持,BitSet但本身不是一个。关于偏爱构图的一些事情。
【你听说过一位财富继承人放弃一切去追求对音乐的热爱吗?他更喜欢组合而不是继承。这是我编造的还是我在 Java One 上听到的?]
毫无疑问,ValueSet应该将更多的方法委托给BitSet,包括isEmpty。
我打算建议尝试values.iterator.isEmpty,但这只是测试hasNext它循环检查所有可能的值是否包含。
https://github.com/scala/scala/blob/v2.11.4/src/library/scala/collection/BitSetLike.scala#L109
如果我没读错的话。
最好的选择是e.values.toBitMask forall (_ == 0),这在道德上相当于BitSet.isEmpty。
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |