Как лучше писать микро-тесты/тесты на производительность в Java? Какие основные пункты, на которые стоит обратить внимание?
Правило 0: почитайте авторитетные статьи про различные JVM и микро-бенчмарки. Например, Brian Goetz, 2005. Но не ожидайте чудес от замеров. Все бенчмарки замеряют ограниченный набор метрик в рамках контекста.
Правило 1: всегда включайте фазу прогрева jvm, прогоняющую ваши тесты для полной инициализации и компиляции перед фазой самих замеров. (По-хорошему, нужно провести несколько десятков тысяч итераций).
Правило 2: Запускайте всегда с флагами -XX:+PrintCompilation
, -verbose:gc
и т.п., чтобы быть уверенными, что компилятор и другие части jvm не будут выполнять незапланированных операций во время фазы замеров.
Правило 3: имейте в виду разницу между -client и -server, а также OSR (On Stack Replacement) и регулярной компиляцией. Предпочитайте сервер клиенту и регулярную компиляцию вместо OSR.
Правило 4: помните об эффекте инициализации. Не выводите ничего в консоль впервые в фазе замеров, так как вывод инициализирует классы. Не загружайте новый классы вне фазы прогрева, если, конечно, вы не тестируете саму загрузку классов.
Правило 5: помните об эффектах деоптимизации и перекомпиляции. Не допускайте, чтобы какие-то ветки коды впервые использовались во время фазы замеров, потому что компилятор может перекомпилировать код на основе более раннего оптимистического предположения о том, что этот путь не будет использоваться вообще. Правило 2 - это ваша первая линия защиты от таких эффектов.
Правило 6: используйте соответствующие инструменты, чтобы читать кишки компилятора, и ожидайте, что будете удивлены от произведённого кода. Осмотрите код самостоятельно, прежде чем формировать теории о том, что же замедляет его.
Правило 7: уменьшите шум в ваших измерениях. Запустите свой тест на машине в спокойном состоянии. Запустите его несколько раз, отбросив выбросы. Используйте -Xbatch
для сериализации компилятора с приложением и рассмотрите возможность установки -XX:CICompilerCount=1
для предотвращения параллельной работы компилятора с самим собой.
Правило 8: используйте уже готовые библиотеки для замеров. Например: JMH, Caliper или Bill and Paul's Excellent UCSD Benchmarks for Java.
Правило 9: если пишите, всё же, сами, то используйте System.nanoTime()
, т.к. с System.currentTimeMillis()
могут быть проблемы. На Linux системах при использовании NTP демона разность двух последовательных System.currentTimeMillis()
может быть отрицательной. Или можно воспользоваться StopWatch
классами из тех же Apache commons или Guava.
Правило 10: будет полезно вызывать System.gc()
между тестами (но не между итерациями!).
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть сайт, на котором есть блок div, в нем есть изменяющиеся div когда захожу в инспектор в браузере их видно нормально, но когда начинаю их парсить...
Имеется задание создать сервлет: UserUpdateServlet