我在相当高吞吐量的设置中使用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实现。 考虑使用BitSet实现ValueSet,这是一个错误吗?
编辑:这是分析器的回溯。这似乎是一种在bitset上实现isEmpty的疯狂方法。
答案 0 :(得分:2)
为了记录,我全都是为了寻找引擎,但这个设计要求任何一个致命的编码器。
当然,神仙有无限的时间可供他们使用。
Enumeration.ValueSet
由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
。