Быстрая очередь в Java

Я ищу быстрое queue реализация в Java. Я вижу это LinkedList реализации Queue интерфейс, но это только будет с такой скоростью, как a LinkedList право? Есть ли способ иметь очередь, которая будет быстрее специально для add (Мне только нужно poll, add и проверьте на empty). По линии мне, возможно, также понадобится a PriorityQueue но еще.

21
задан Eqbal 22 February 2010 в 18:18
поделиться

3 ответа

Я вижу, что LinkedList реализует интерфейс Queue, но он будет быстрым только как LinkedList, верно?

Если посмотреть на исходный код, LinkedList - это O(1) для операций Queue.add, Queue.poll и Queue.peek.

Надеюсь, это достаточно быстро.

28
ответ дан 29 November 2019 в 06:25
поделиться

Если несколько потоков будут обращаться к очереди, рассмотрите возможность использования ArrayBlockingQueue . В противном случае посмотрите ArrayDeque . Из ArrayDeque API:

Этот класс, вероятно, будет быстрее, чем Stack при использовании в качестве стека, и быстрее , чем LinkedList при использовании в качестве очереди.

В частности, реализация очереди на основе массива снижает необходимость изменения размера базового массива, если существующий массив имеет достаточную емкость, таким образом, добавление в очередь обычно выполняется быстрее, чем LinkedList . Имейте в виду, что ArrayBlockingQueue является ограниченной реализацией, тогда как ArrayDeque будет изменять размер по мере необходимости.

Обратной стороной является то, что LinkedList обычно обеспечивает гораздо более компактное представление, особенно в тех случаях, когда ваша очередь увеличивается и уменьшается в больших размерах. Например, если вы добавили 10 000 000 элементов в ArrayDeque , а затем удалили 9 999 999 элементов, базовый массив по-прежнему будет иметь длину 10 000 000, тогда как LinkedList не столкнется с этой проблемой.

На самом деле, для однопоточного доступа к неблокирующей очереди я предпочитаю LinkedList . Я полагаю, что разница в производительности настолько незначительна, что вы все равно не заметите разницы.

31
ответ дан 29 November 2019 в 06:25
поделиться

Другим вариантом может быть использование SetLength (0) для усечения файла перед его перезаписью.

-121--2320259-

Пробовали ли вы ftw () aka Обход дерева файлов ?

Фрагмент от man 3 ftw :

int ftw (const char * dir, int (* fn) (const char * файл, const struct stat * sb, флаг int), int nopenfd);

ftw () проходит через дерево каталогов, начиная с указанного диска каталога. Для каждой найденной записи в дереве вызывается fn() с полным именем пути записи, указателем на состояние(2) Структура для записи и флага int

-121--2579238-

Если производительность связанного списка действительно была проблемой, альтернативой будет реализация «круговой очереди» в массиве, то есть очереди, где начальная и конечная точки перемещаются по мере добавления и удаления записей. Я могу дать более подробную информацию, если вы заботитесь. Когда я использовал языки, которые не имели библиотеки коллекций, так я всегда реализовывал очереди, потому что было проще писать, чем связанный список, и это было быстрее. Но со встроенными коллекциями, усилия по написанию и отладке моей собственной коллекции для особого случая не стоит беды 99% времени: Когда она уже написана, то, что я мог написать ее по-другому быстрее, чем я мог бы переписать ее так, как это делает Java, в значительной степени не имеет значения. И любой прирост производительности, скорее всего, будет слишком мал, чтобы стоить неприятностей. Я подтипую существующие коллекции, чтобы получить особое поведение, которое мне нужно то и дело, но мне трудно думать о последнем случае, когда я написал одну с нуля.

6
ответ дан 29 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: