2009-06-23 4 views
3

У меня есть переводчик, написанный на Java. Я пытаюсь проверить результаты работы различных оптимизаций в интерпретаторе. Для этого я разбираю код, а затем повторно запускаю интерпретатор над кодом, это продолжается до тех пор, пока я не получу 5 прогонов, которые отличаются очень небольшим отрывом (0,1 с в раз ниже), среднее значение берется и печатается. В интерпретаторе нет ввода-вывода или случайности. Если я снова запустить интерпретатор я получаю различное время работы:Производительность Java Несоответствие

91.8s 
95.7s 
93.8s 
97.6s 
94.6s 
94.6s 
107.4s 

Я пытался без толка сервера и клиент VM, последовательный и параллельный гх, большие столы и окна и Linux. Они находятся на 1.6.0_14 JVM. У компьютера нет процессов, работающих в фоновом режиме. Поэтому я спрашиваю, что может вызвать эти большие вариации или как я могу узнать, что это такое?


actualy проблема была вызвана тем, что программа должна была итерацию к раствору фиксированной точки, а значения были сохранены в HashSet. Хешированные значения отличались между прогонами, что приводило к другому порядку, что в свою очередь приводило к изменению количества итераций, необходимых для достижения решения.

+0

Куча установлена ​​как -Xms1024M -Xmx1024M. – Molehill

+0

что вы пытались? – akf

ответ

17

«Часы настенные часы» редко являются хорошим показателем для бенчмаркинга. Современная ОС крайне маловероятна: «[нет] процессов, выполняющихся в фоновом режиме» - для всего, что вы знаете, это может быть запись грязных буферов блоков на диск, потому что принято решение, что нет другого спора.

Вместо этого я рекомендую использовать ThreadMXBean для отслеживания фактического потребления ЦП.

+0

+1 JMX Это путь. – Tom

+0

Возможно, я немного преувеличиваю «без процессов». Однако любой процесс, который работает, вряд ли вмешивается и все же допускает 5 прогонов подряд, которые отличаются только на 0,1 с. Машина имеет два ядра. – Molehill

+0

Что касается абстракции, я бы сказал, что Java слишком далека от аппаратного обеспечения, чтобы ожидать согласованных результатов ... у вас просто недостаточно контроля. – Dolph

1

сбор мусора может быть ответственным. Несмотря на то, что ваша логика одинакова, может случиться так, что логика GC запланирована на внешние часы/события.

Но я не так много знаю о внедрении GC JVMs.

+0

add -verbose: gc в командной строке args, если вы хотите видеть вывод – akf

5

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

Вещи, которые могут повлиять на время выполнения:

  • если ваши тестовые прогоны создания объектов (может быть невидимым для вас, в библиотечных вызовов и т.д.), то ваши повторы могут вызвать GC

  • Different GC-алгоритмы, спецификации будут реагировать по-разному, разные пороговые значения для инкрементного gc. Вы можете попробовать запустить System.gc() перед каждым прогоном, хотя JVM не гарантируется GC, когда вы это называете (хотя это всегда имеет место, когда я играл с ним) .T В зависимости от размера вашего теста, и сколько итераций вы запускаете, это может быть неприятно (и почти бесполезно) медленнее ждать.

  • Вы проводите какие-либо рандомизации в рамках своих тестов? например если вы тестируете целые числа, значения < | 128 | могут обрабатываться несколько иначе в памяти.

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

+0

Перед каждым запуском я выполняю «System.runFinalization(); System.gc();» и продолжайте до тех пор, пока свободная память не останется неподвижной и не будет отложенных объектов. – Molehill

1

Это кажется существенным изменением для меня, я бы попробовал работать с -verbosegc.

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

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

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