Я ищу быстрое queue
реализация в Java. Я вижу это LinkedList
реализации Queue
интерфейс, но это только будет с такой скоростью, как a LinkedList
право? Есть ли способ иметь очередь, которая будет быстрее специально для add
(Мне только нужно poll
, add
и проверьте на empty
). По линии мне, возможно, также понадобится a PriorityQueue
но еще.
Я вижу, что LinkedList реализует интерфейс Queue, но он будет быстрым только как LinkedList, верно?
Если посмотреть на исходный код, LinkedList - это O(1) для операций Queue.add, Queue.poll и Queue.peek.
Надеюсь, это достаточно быстро.
Если несколько потоков будут обращаться к очереди, рассмотрите возможность использования ArrayBlockingQueue
. В противном случае посмотрите ArrayDeque
. Из ArrayDeque
API:
Этот класс, вероятно, будет быстрее, чем Stack при использовании в качестве стека, и быстрее , чем LinkedList при использовании в качестве очереди.
В частности, реализация очереди на основе массива снижает необходимость изменения размера базового массива, если существующий массив имеет достаточную емкость, таким образом, добавление в очередь обычно выполняется быстрее, чем LinkedList
. Имейте в виду, что ArrayBlockingQueue
является ограниченной реализацией, тогда как ArrayDeque
будет изменять размер по мере необходимости.
Обратной стороной является то, что LinkedList
обычно обеспечивает гораздо более компактное представление, особенно в тех случаях, когда ваша очередь увеличивается и уменьшается в больших размерах. Например, если вы добавили 10 000 000 элементов в ArrayDeque
, а затем удалили 9 999 999 элементов, базовый массив по-прежнему будет иметь длину 10 000 000, тогда как LinkedList
не столкнется с этой проблемой.
На самом деле, для однопоточного доступа к неблокирующей очереди я предпочитаю LinkedList
. Я полагаю, что разница в производительности настолько незначительна, что вы все равно не заметите разницы.
Другим вариантом может быть использование 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);
-121--2579238-ftw () проходит через дерево каталогов, начиная с указанного диска каталога. Для каждой найденной записи в дереве вызывается fn() с полным именем пути записи, указателем на состояние(2) Структура для записи и флага int
Если производительность связанного списка действительно была проблемой, альтернативой будет реализация «круговой очереди» в массиве, то есть очереди, где начальная и конечная точки перемещаются по мере добавления и удаления записей. Я могу дать более подробную информацию, если вы заботитесь. Когда я использовал языки, которые не имели библиотеки коллекций, так я всегда реализовывал очереди, потому что было проще писать, чем связанный список, и это было быстрее. Но со встроенными коллекциями, усилия по написанию и отладке моей собственной коллекции для особого случая не стоит беды 99% времени: Когда она уже написана, то, что я мог написать ее по-другому быстрее, чем я мог бы переписать ее так, как это делает Java, в значительной степени не имеет значения. И любой прирост производительности, скорее всего, будет слишком мал, чтобы стоить неприятностей. Я подтипую существующие коллекции, чтобы получить особое поведение, которое мне нужно то и дело, но мне трудно думать о последнем случае, когда я написал одну с нуля.