2013-03-28 2 views
0

Существует ли установленный способ измерения (или получения существующей меры) сложности метода класса JDK? Является ли javap временной сложностью и в какой степени. В частности, меня интересует сложность Arrays.sort(), а также некоторые другие методы манипуляции с коллекциями.Мера сложности времени методов класса JDK

E.g. Я пытаюсь сравнить две реализации для производительности, один использует Arrays.sort(), а другой нет. Разборка javap для этого не возвращает намного больше шагов (в два раза больше), но я не уверен, что тот, который делает, исключает шаги Arrays.sort(). IOW, javap одного метода включает рекурсивную меру методов, вызванных внутри или только для этого метода?

Кроме того, существует ли способ, без изменения и перекомпиляции самого Java-кода, чтобы найти, сколько циклов было выполнено, когда определенный базовый метод Java был вызван по определенным параметрам? Например. измерять количество итераций Arrays.sort('A', 'r', 'T', 'f')?

ответ

3

Я бы не ожидал, что javap будет даже немного отличаться от фактической скорости.

Javadoc определяет алгоритмическую сложность, но если вы заботитесь о постоянных факторах, то нет абсолютно никакого способа реалистично сравнивать постоянные факторы, кроме как с фактическим benchmarks.

Вы не можете получить любую информацию о том, что было сделано, когда Arrays.sort вызываются примитивным массив, но, передавая обычай Comparator, который подсчитывает количество вызовов, вы можете подсчитать количество сравнений при сортировке массива объектов , (Тем не менее, массивы объектов сортируются с использованием другого алгоритма сортировки, в частности стабильного, и примитивные массивы сортируются по варианту Quicksort.)

+0

У этого пользователя нет загрузок для «Калипера» на этой странице. – amphibient

+0

Калибр немного в движении; они делают полную переписку - но остается то, что вам нужно фактически запускать сортировки и время их. –

+0

так что в основном делать выборку с фактическими данными? – amphibient

1

Вы можете использовать вывод из javap, чтобы определить, где происходят петли, которые вы хотите найти в инструкции goto. Это post дает исчерпывающее объяснение этой идентификации.

От поста:

Прежде чем рассматривать любые начало цикла/выход приборы, вы должны смотреть в определение того, что вход, выход и преемники. Хотя в цикле будет только одна точка входа, она может иметь несколько точек выхода и/или несколько преемников, как правило, вызванных перерывами (иногда с метками), операторами возврата и/или исключениями (явно пойманными или нет). Пока вы не указали детали относительно вида приборов, которые вы изучаете, это , конечно же, стоит подумать о том, где вы хотите вставить код (если это , что вы хотите сделать). Как правило, некоторые приборы могут быть сделаны перед каждым оператором выхода или вместо каждого заявления-преемника (в этом случае вам придется переместить исходный оператор).

+0

но делает ' javap' одного метода включает рекурсивную меру методов, вызванных внутри или только для этого метода? – amphibient

+1

@amphbient большой вопрос. Этого я не знаю, но меня это интересует с научной точки зрения. – Woot4Moo

+0

@amphibient: только для этого метода. –

0

Arrays.sort() для примитивов использует настроенную быстродействующую сортировку. Для Object использует mergesort (но это зависит от реализации).

От: Arrays

К примеру, алгоритм, используемый рода (Object []) не должны быть слиянием, но она должна быть стабильной

+1

@downvoter: вы должны комментировать. OP спрашивает о сравнении методов сортировки. В чем проблема, объясняя, какие методы сортировки фактически используются в качестве ответа? – Cratylus

+0

OP тоже получил понижение. я не знаю, почему – amphibient

Смежные вопросы