В блоге:

2009-10-01

Java primitive

Если эффективно работать с примитивными типами (int и т.п.), то использовать встроенные в Java коллекции (ArrayList, HashMap и т.п.) не очень желательно. Из-за оборачивания (в Integer и т.п.) и памяти больше расходуется, и скорость ниже.

Есть несколько библиотек для работы с коллекциями примитивов. Я посмотрел доступные и погонял разные тесты для моих задач (это, в основном, list of int, set of int, int to int map, object to int map, int to object map). Не буду приводить результаты. Их много и они узконаправленные. Но приведу краткие субъективные впечатления (порядок перечисления произвольный):

1. java.util.* Как ожидалось, проигрыш по скорости и памяти хорошим конкурентам, но не чистый проигрыш. По некоторым тестам было не самое последнее место. Как старт пойдет, но потом лучше уходить.

2. GNU Trove. Весьма неплохая библиотека. Боролась за первое место, кое-где проигрывала, кое-где выигрывала. Активно до сих пор развивается. Лицензия LGPL. Рекомендую начинать с нее.

3. Colt. Середнячок. Нигде не выиграл, но особо плохо не выглядел. В библиотеке не самая полная коллекция, кое-что пришлось использовать из java.util. Развитие остановилось в 2004 году.

4. Primitive Collections for Java. Для hash set/map есть по две реализации с разным способом разрешения конфликтов хешей: chained и open. Open, в целом, лучше для моих задач. По скорости и экономии памяти уверенно держится на первом-втором местах (конкурентом выступает только Trove). Назвал PCJ лучшей библиотекой для своих задач, но его развитие остановилось в 2003 году. Смотрите сами. Либо он, либо Trove.

5. Javolution. Разочарование. По сайту прямо таки решение на все случаи жизни. На моих задачах полный провал. Возможно, что я как-то не так применял, но с остальными таких проблем нет. Жуткое потребление памяти и низкая скорость работы. Часто проигрывает даже стандартным java.util.*. Возможно, что для других задача будет сильно лучше.

6. fastutil. Несбалансированная библиотека. Кое-где держалась на среднем уровне. А на задаче, где идет куча созданий коллекций и параллельные обращения к ним, почему-то сильно проиграла. Имеет гигантский размер jar-файла. Хотя задумка неплохая была (совместимость с java.util, но добавление собственных быстрых методов). Возможно для каких-то задача будет неплохой.

7. tclib. Сразу всплыла ошибка при удалении по индексу (в списке из одного элемента не работает удаление элемента по индексу 0), после чего тестирование не проводилось.

Есть и другие коллекционные библиотеке (те же apache commons, гугловские и другие), но они не проверялись, поскольку они не заявлены как решение проблем с коллекциями примитивов. Было несколько коллекций, которые реализуют только списки. Они тоже не рассматривались.

К слову, на 64-битной Java под MacOS X проигрыш по затратам памяти примерно полуторакратный сравнительно с 32-битной Java под WinXP. За длинные указатели надо платить.

p.s. (обновление от 2011 года): к сожалению, при эксплуатации PCJ вылезли какие-то странные баги, поэтому не рекомендую его использовать (особенно с учетом, что проект заброшен).

0 comments:

Post a Comment

Blog Archive