Хэш-наборы реализации или методы для эффективного мелкого клонирования? - PullRequest
1 голос
/ 05 января 2012

Критическая часть моего алгоритма включает в себя клонирование Set объектов. Я попытался несколько подходов к оптимизации этой операции, в том числе:

  • Повторное использование элементов, поэтому мне нужно только поверхностное копирование - большой прирост производительности.
  • Использование метода наборов clone вместо ручной вставки объектов - незначительное повышение производительности (возможная причина приведена ниже).
  • Заставить классы, содержащие набор, поддерживать флаг копирования при записи, чтобы клонировать эти объекты было O (1), и только при вставке / удалении наборы были клонированы - некоторое повышение производительности.
  • Наконец, я также подумал, могу ли я вообще отказаться от этого подхода, но это тема для другого вопроса:)

Однако профилирование показывает, что операция клонирования все еще занимает значительное время. Я могу жить с этим, но мне было интересно, есть ли какие-нибудь приемы, которые позволят мне дополнительно оптимизировать эту операцию - например, я слышал о приеме клонирования с помощью сериализации, хотя я не уверен, что помощь.

Я также открыт для перехода на другую реализацию интерфейса Java Set, если он зависит от hashCode и equals. Мои наборы, как правило, не очень большие, до десятков элементов, поэтому я также готов пожертвовать некоторой эффективностью от традиционных операторов наборов (add, contains), если это может помочь. Я даже думал о переходе к пользовательской реализации, поддерживаемой LinkedList или каким-то другим списком пропусков, но перед этим я хотел спросить здесь, есть ли у кого-нибудь опыт или понимание этого.

РЕДАКТИРОВАТЬ: для тех, кто спрашивает почему Мне нужно клонировать эти наборы столько раз - это хороший вопрос! Прямо сейчас алгоритм основан на инициализации одной группы наборов, чтобы они были идентичны другой группе наборов, и позже обе группы могут быть независимо обновлены, поэтому клонирование показалось мне очевидным решением - но определенно может существовать лучшее решение. Как я писал в 4-м пункте выше, я действительно мог бы выбрать другое решение, но в то же время я хотел бы сосредоточить этот вопрос на оптимизации существующего одного.

1 Ответ

0 голосов
/ 05 января 2012

Сериализация намного медленнее, чем глубокое клонирование. Я сомневаюсь, что это поможет.

Самое эффективное решение - во-первых, избегать клонирования, тогда это не займет времени. Возможно, с более подробной информацией о том, почему вы используете клонирование, мы можем предложить альтернативу.

Одним из способов ускорения клонирования является наличие набора, который ссылается на неизменный набор и запоминает различия, скажем, Map<E, Boolean>, где значение равно true или false, в зависимости от того, было ли оно добавлено или удалено. Это будет работать лучше всего, если количество изменений относительно мало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...