Критическая часть моего алгоритма включает в себя клонирование Set
объектов. Я попытался несколько подходов к оптимизации этой операции, в том числе:
- Повторное использование элементов, поэтому мне нужно только поверхностное копирование - большой прирост производительности.
- Использование метода наборов
clone
вместо ручной вставки объектов - незначительное повышение производительности (возможная причина приведена ниже).
- Заставить классы, содержащие набор, поддерживать флаг копирования при записи, чтобы клонировать эти объекты было O (1), и только при вставке / удалении наборы были клонированы - некоторое повышение производительности.
- Наконец, я также подумал, могу ли я вообще отказаться от этого подхода, но это тема для другого вопроса:)
Однако профилирование показывает, что операция клонирования все еще занимает значительное время. Я могу жить с этим, но мне было интересно, есть ли какие-нибудь приемы, которые позволят мне дополнительно оптимизировать эту операцию - например, я слышал о приеме клонирования с помощью сериализации, хотя я не уверен, что помощь.
Я также открыт для перехода на другую реализацию интерфейса Java Set
, если он зависит от hashCode
и equals
. Мои наборы, как правило, не очень большие, до десятков элементов, поэтому я также готов пожертвовать некоторой эффективностью от традиционных операторов наборов (add
, contains
), если это может помочь. Я даже думал о переходе к пользовательской реализации, поддерживаемой LinkedList
или каким-то другим списком пропусков, но перед этим я хотел спросить здесь, есть ли у кого-нибудь опыт или понимание этого.
РЕДАКТИРОВАТЬ: для тех, кто спрашивает почему Мне нужно клонировать эти наборы столько раз - это хороший вопрос! Прямо сейчас алгоритм основан на инициализации одной группы наборов, чтобы они были идентичны другой группе наборов, и позже обе группы могут быть независимо обновлены, поэтому клонирование показалось мне очевидным решением - но определенно может существовать лучшее решение. Как я писал в 4-м пункте выше, я действительно мог бы выбрать другое решение, но в то же время я хотел бы сосредоточить этот вопрос на оптимизации существующего одного.