Низкая производительность в приложении Springboot (kotlin, gradle) с bootRun и без isOptimizedLaunch = false - PullRequest
1 голос
/ 17 января 2020

Когда я запускаю свою функцию в тесте junit, у меня время на 1000 быстрее, чем с помощью bootRun. Когда я устанавливаю в build.gradle.kts

tasks.getByName<org.springframework.boot.gradle.tasks.run.BootRun>("bootRun") {
    isOptimizedLaunch = false
}

время равно, то тестовый запуск. Почему это происходит? Как я могу оптимизировать bootJar? bootJar не имеет параметра isOptimizedLaunch

Пример функции

package com.example.demo

import java.util.concurrent.TimeUnit

class LongFun {
    fun main() {
        val startTime = System.nanoTime()

        for (i1 in 0..10000) {
            longFun(1000)
        }

        val endTime = System.nanoTime()

        val durationInNano = endTime - startTime //Total execution time in nano seconds

        var durationInMillis = TimeUnit.NANOSECONDS.toMillis(durationInNano)
        println("time=$durationInMillis")
    }

    fun longFun(n: Int) {
        for (i2 in 0..n) {
            for (i3 in 0..n) {
                var a = 1
            }
        }
    }
}

Полный код, который я сделал с https://start.spring.io/ (gradle, kotlin) и не изменился что угодно

ОБНОВЛЕНИЕ1. Это простой пример, в действительности та же проблема в моем приложении с optaplanner, он также имеет много вычислений.

UPDATE2. С maven у меня такой же плохой результат

  • В тесте - 2ms
  • В Gradle с isOptimizedLaunch = false - 2ms
  • В Gradle без isOptimizedLaunch = false - 5245ms
  • В Maven - 5146мс

1 Ответ

0 голосов
/ 20 января 2020

Из того, что я могу сказать, свойство optimizedLaunch добавляет только следующие два аргумента в команду запуска JVM и ничего больше:

  • -XX:TieredStopAtLevel=1
  • -Xverify:none

Последний не используется, если вы используете Java 13 или более позднюю версию.

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

Однако, если вы отключите optimzedLaunch для определения приоритетов производительности времени выполнения, вы также должны увидеть увеличение времени запуска на JVM. В одном из моих проектов Spring Boot время запуска увеличилось с ~ 7 до 13 с. Таким образом, в реальном проекте на этапе разработки вы должны решить, хотите ли вы оптимизировать его для быстрого запуска или быстрого выполнения.

Когда вы находитесь в точке, где вы будете запускать свое приложение в производственных условиях, Скорее всего, вы будете использовать файл jar, созданный задачей bootJar (или dist). Здесь вы несете ответственность за предоставление аргументов JVM. Если вы этого не предоставите, вы получите поведение JVM по умолчанию, которое заключается в использовании многоуровневой компиляции (соответствует optimzedLaunch=false).

...