2014-12-24 2 views
6

Я использую Scala Enumeration ValueSets с довольно высокой пропускной способностью - создание, тестирование, объединение и пересечение около 10M наборов/second/core. Я не ожидал, что это будет большой проблемой, потому что я где-то читал, что они поддерживаются BitSets, но на удивление ValueSet.isEmpty появился как горячая точка в профилирующем сеансе с YourKit.Scala Enumeration ValueSet.isEmpty slow

Чтобы проверить, я решил попробовать и переопределить то, что мне нужно, используя Java BitSet, пытаясь сохранить некоторую безопасность типов использования Scala Enumerations. (обзор кода переместился на https://codereview.stackexchange.com/questions/74795/scala-bitset-implemented-with-java-bitset-for-use-in-scala-enumerations-to-repl). Хорошая новость заключается в том, что изменение моих наборов ValueSets на эти BitSets действительно отменило 25% моего времени выполнения, поэтому я не знаю, что ValueSet действительно делает под капотом, но его можно улучшить ...

EDIT: просмотр источника ValueSet указывает на то, что isEmpty определенно O (N), реализованный с использованием общего SetLike.isEmpty. Учитывая, что ValueSet реализован с помощью BitSet, это ошибка?

EDIT: Это была обратная трассировка из профилировщика. Это кажется сумасшедшим способом реализации isEmpty на битете.

Backtrace of hot spot in YourKit

+0

«Я не знаю, что ValueSet действительно делает под капотом». Источник доступен, если вы хотите взглянуть: https://github.com/scala/scala/blob/v2.11.4/src/library/scala/Enumeration.scala#L1 –

+0

Похоже, у вас есть рабочий код что вы хотите получить обратную связь. Если это так, вы должны перенести свой вопрос на [codereview.se]. В противном случае, пожалуйста, рассмотрите свой вопрос и сделайте реальный вопрос более очевидным - мне потребовалось некоторое время, чтобы даже найти то, о чем вы спрашивали. –

+0

Спасибо, глядя сейчас. До сих пор, похоже, я подтверждал, что нашел в профилировщике (прилагается); ValueSet.isEmpty, по крайней мере, полностью реализуется с помощью общих алгоритмов, пренебрегая тем, что для BitSet это должно быть не более сложным, чем (x == 0). – experquisite

ответ

1

Для записи, я все для смотреть под капотом, но эта конструкция требует слишком много любого смертного кодера.

Бессмертные, конечно же, имеют в своем распоряжении бесконечное время.

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.