Каков наиболее эффективный способ реализации неблокирующей очереди фиксированного размера в Java? - PullRequest
4 голосов
/ 11 февраля 2011

Я пытаюсь найти (или написать) класс Java, представляющий неблокирующую, автоматически блокирующую очередь FIFO фиксированного размера. (например, если очередь имеет емкость 100, помещение элемента 101 удаляет элемент 1, затем успешно добавляет элемент 101.) Ответ на этот вопрос кажется полезным, но у меня есть дополнительное ограничение - мне нужно, чтобы оно было быстро, для мощностей около 100-1000.

Элементы в моей очереди - только Float, так что, как правило, более эффективно использовать что-то вроде AutoDiscardingDeque<Float>, описанное в связанном вопросе, или просто использовать float[] и некоторые манипуляции System.arraycopy() для обработки?

В качестве альтернативы, есть ли еще лучшее решение, о котором я не подумал?

Ответы [ 3 ]

2 голосов
/ 11 февраля 2011

Если вам когда-либо понадобится использовать float, тогда да, float[] будет оптимальным в реализации. Вам вообще не нужно копировать массив - просто сохраняйте «начальную позицию» и «конечную позицию». Вы уже знаете емкость, поэтому вы можете создать массив для начала и никогда не выделять его.

Обратите внимание, что я не предлагаю вам использовать float[] вместо очереди здесь - просто вы можете реализовать очередь , используя a float[]. Конечно, это означает, что вы не можете легко заставить его реализовать Deque<Float>, чего вы, возможно, захотите, без затрат на упаковку / распаковку ... но если вы довольны использованием только конкретного класса в своем клиентском коде, вы в конечном итоге с экономией эффективности.

1 голос
/ 11 февраля 2011

Если вы думаете, что захотите выполнить ряд математических функций в вашей структуре, в частности статистические функции, такие как среднее, максимальное, минимальное и т. Д., То вы можете использовать DescriptiveStatistics из Apache Commons Math (http://commons.apache.org/math/userguide/stat.html#a1.2_Descriptive_statistics). YouВы можете установить размер окна, и он будет автоматически поддерживать ваши элементы. Однако это требует удвоения, а не числа с плавающей запятой, поэтому это может быть не лучшим решением для вас.

0 голосов
/ 11 февраля 2011

Мне нужно, чтобы это было быстро, для мощностей около 100-1000

Пожалуйста, уточните, какие операции вам нужно выполнить быстро? Реализация очень чувствительна к тому, как вы собираетесь ее использовать. Если вам нужен очень частый доступ к нему по индексу, то приведенное выше решение кажется достаточно хорошим

...