Scala Enumeration ValueSet.isEmpty很慢

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的疯狂方法.

在YourKit中回溯热点

som*_*ytt 2

根据记录,我完全赞成深入了解底层,但这种设计对任何凡人编码员的要求太多了。

当然,神仙们有无限的时间可以支配。

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