Векторы являются массивами под капотом. Производительность является тем же.
Одно место, где можно столкнуться с проблемой производительности, не измеряет вектор правильно для начала.
, Поскольку вектор заполняется, он изменит размеры себя, и это может подразумевать, новое распределение массива, сопровождаемый n копируют конструкторов, сопровождаемых приблизительно n вызовы деструктора, сопровождаемый массивом удаляют.
, Если Ваш создавать/разрушать является дорогим, Вы - очень более обеспеченное создание вектора корректный размер для начала.
существует простой способ продемонстрировать это. Создайте простой класс, который показывает, когда он создан/уничтожен/скопирован/присвоен. Создайте вектор этих вещей и начните продвигать их на бэкэнде вектора. Когда вектор заполнится, будет каскад действия, поскольку вектор изменяет размеры. Тогда попробуйте его снова вектором, измеренным к ожидаемому числу элементов. Вы будете видеть различие.
Этот вопрос SO является хорошим обсуждением сохранения и слияния, и принятый ответ довольно хорошо это объясняет. Другой ответ также ссылается на хорошее сообщение в блоге об этом.
Согласно первому ответу в , это другое сообщение , похоже, можно было бы вызвать слияние как для сохранения, так и для обновления объекта, но я сделал это не так. В моих приложениях Spring / JPA я просто использую DAO, расширяющие JpaDaoSupport, и использую getJpaTemplate () следующим образом.
/**
* Save a new Album.
*/
public Album save(Album album) {
getJpaTemplate().persist(album);
return album;
}
/**
* Update an existing Album.
*/
public Album update(Album album) {
return getJpaTemplate().merge(album);
}
Ссылка на другой вопрос SO, заданный Калебом, действительно хорошо справляется с описанием различий и подводных камней persist () vs merge (). Однако я всегда просто реализовывал свои классы Dao с помощью одного метода save (), который вызывает только merge () для обработки как вставок, так и обновлений, и я никогда не сталкивался ни с одним из подводных камней persist () vs merge ().
Что касается производительности и транзакционных методов:
Использование @Transactional
в методах, которые являются только операциями чтения, на самом деле не повлияет на производительность, хотя я предпочитаю использовать аннотации на уровне методов, чтобы легко определить, какие методы являются обновленными, а какие - читаемыми. Вы можете сделать это, установив атрибут readOnly
в аннотации @Transactional
.
Если вы следуете соглашению об именах в своих методах (т.е. любой метод чтения всегда начинается с getXXX
), вы также можете использовать синтаксис poincut в файле конфигурации Spring, чтобы автоматически делать это различие:
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
Подробнее см. документацию Spring по транзакциям .
Также я обычно помещаю @Transactional
атрибуты на один уровень выше моих классов Dao на уровне обслуживания.