Ну, как быстро ты хочешь, чтобы это было?Код в brics.dk / automaton объявляет свои собственные State и Transition классы, хотя, очевидно, они могут быть переписаны с использованием примитивов (черт, весь Переход состояние класса, очевидно, легко поместится в long
).
Дело в том, что если вы, например, переместите класс Transition
в простой примитив, то вы невынужден больше использовать медленные HashMap<Transition,...>
коллекции Java по умолчанию: вы можете использовать библиотеки вроде Trove TLongObjectHashMap
(или TLongInt
... или TLongLong
, что угодно), которым принадлежит значение по умолчанию HashMap
большие времена (библиотеки Trove в основном предоставляют карты и наборы, которые являются очень эффективными, быстрыми и маленькими, когда вы работаете с примитивами: вы не генерируете бесчисленное количество мусора или постоянную ненужную обертку вокруг примитивов, поэтому меньше GC и т. д. Если выв производительность, тогда вы действительно хотите проверить Trove ... И их предстоящая версия 3.0 на 20% быстрее, чем Trove 2.0).
Но действительно ли это полезно?Видимо, эта библиотека уже достаточно быстро.Нет никаких сомнений в том, что это можно сделать быстрее, не создавая ненужных объектов и используя коллекции, которые действительно хорошо работают, но не ясно, что это было бы желательно.
Кроме того, я почти уверен, что приведенная выше библиотекане является потокобезопасным.Конструктор State создает уникальный идентификатор, выполняя это:
static int next_id;
.
.
.
id = next_id++;
, и этот конструктор вызывается из ... 90 разных мест!
Пример из учебника о способе не создать уникальный идентификатор в многопоточном сценарии (черт, даже сделать next_id
volatile было бы недостаточно, вы хотите, скажем, AtomicInteger здесь).Я не знаю библиотеку достаточно хорошо, но эта идентификационная штуковина выглядит очень подозрительно для меня.