Улучшение сравнимо <T>сравнить с производительностью - PullRequest
1 голос
/ 10 марта 2009

Я профилировал свой код и обнаружил, что мой класс, который реализует Comparable<T>, тратит в 8 раз больше времени процессора в

compareTo(Object)

чем в

compareTo(T)

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


Есть ли способ вызвать статический вызов функции? (как в не виртуальных методах C ++)

Я все еще хочу использовать интерфейс Comparable<T>, так как я использую TreeSet с этим объектом, и я бы не хотел переписывать этот код.


РЕДАКТИРОВАТЬ: Нет, я не реализовал compareTo (Объект) - это было автоматически сгенерировано и сообщил профилировщик

Ответы [ 4 ]

4 голосов
/ 10 марта 2009

причина, по которой вы видите compareTo(Object), связана с Типом Erasure . это просто означает, что во время выполнения информация о типе больше не нужна для сравнения значений. скорее всего причина вашего замедления 1) очень, очень большой TreeSet с большим количеством элементов 2) - скорее всего - ваш метод сравнения делает что-то дорогое. поскольку он вызывается очень часто (обычно n * ln (n) раз), он должен быть реализован эффективно

2 голосов
/ 10 марта 2009

Нет, в этом случае вы не можете принудительно вызвать статический вызов.

Метод экземпляра может быть вызван «не виртуально» с помощью инструкции invokespecial. Эта инструкция используется, когда цель известна во время компиляции, как конструктор или закрытый метод. В других случаях - даже если целевым методом является final - используются инструкции invokevirtual или invokeinterface.

1 голос
/ 10 марта 2009

Поскольку java не сохраняет универсальных типов во время выполнения, в идеале оба должны вести себя одинаково. Возможно, что-то еще вызывает проблему.

0 голосов
/ 10 марта 2009

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

Вам не нужно угадывать, правда ли это. Просто сделайте паузу несколько раз, и вы поймете это в действии. Отображение стека вызовов полностью, включая вызовы в подпрограммах библиотеки.

Мое предположение (что может быть неверным) состоит в том, что он проходит через девять ярдов вызова OLE-стиля.

...