Когда мне нужно заботиться о производительности нескольких алгоритмов, лучше ли заставлять Java никогда не JIT компилировать мои методы? - PullRequest
2 голосов
/ 27 февраля 2012

При сравнении двух различных реализаций алгоритма (таким образом, не заботясь об их абсолютной, а только относительной производительности), лучше ли я заставлять Java запускать только интерпретируемый код?

То есть мне лучше было бы сфлаг -Xint включен?

Ответы [ 4 ]

8 голосов
/ 27 февраля 2012

Не думаю, что вам лучше отключить JIT.

Либо вы решите измерить абстрактную, асимптотическую производительность (и в этом случае вам определенно понадобится нотация big-O), либо вы решитедля измерения производительности данной реализации на данной машине для заданных входных данных.

Если вы решите пойти на последнюю, то было бы бессмысленно отключать JIT: вам нужно измерить производительность вреалистичная среда, и в реалистичной среде у вас обычно будет JIT-компиляция.

1 голос
/ 05 марта 2012

вопрос в том ... будете ли вы отключать JIT и на производстве ... искусство анализа производительности гарантирует, что вы действительно измеряете ту же самую (модель), которую вы пытаетесь наблюдать, понимать и оптимизировать.

если вы хотите сравнить алгоритмы без фактического профилирования их поведения в реальных условиях (load, env, state, ...), то вы можете использовать проверенный метод создания таблицы затрат для каждого драйвера затрат на выполнение и затем суммировать эти затраты при выполнении (или прохождении) теста.

1 голос
/ 27 февраля 2012

Оба.

Если вы выполняете тест, вы хотите получить информацию о том, какие настройки среды влияют на производительность.

Возможно, вы не сможете запустить свои алгоритмы со всеми конфигурациями компьютерадоступно, но следует учитывать эффект включения / выключения JIT.

1 голос
/ 27 февраля 2012

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

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

Обычный способ измерить производительность в Java - сначала дать ей «прогреться» - запустить алгоритм несколько раз (см. -XX: CompileThreshold) сначала получить его для компиляции, а затем время.

...