spring-boot - 带有bootRun且未优化启动的Spring Boot应用程序(kotlin,gradle)中的性能低下= false

标签 spring-boot maven gradle kotlin bootrun

当我在junit test中运行函数时,我的时间比使用bootRun快约1000倍。
当我设置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
  • 与isOptimizedLaunch = false关联-2ms
  • 在没有isOptimizedLaunch = false的情况下-5245ms
  • 在行家中-5146ms
  • 最佳答案

    据我所知,optimizedLaunch属性仅将以下两个参数添加到JVM启动命令中,而没有其他内容:

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

  • 如果您使用的是Java 13或更高版本,则不使用后者。

    这些参数用于使JVM更快地启动以进行开发和测试。这是以限制JVM在运行时优化自身的能力为代价的。禁用运行时优化时看到如此低的性能并不罕见。

    但是,如果禁用optimzedLaunch来区分运行时性能的优先级,则还应该看到JVM上的启动时间增加了。在我的一个Spring Boot项目中,启动时间从〜7s缩短到13s。因此,在实际项目中,在开发阶段,您必须决定要优化它以便快速启动或快速运行。

    当您要在生产环境中运行应用程序时,很可能会使用bootJar(或dist)任务创建的jar文件。在这里,您负责提供JVM参数。如果不提供任何内容,则将获得JVM的默认行为,即使用分层编译(对应于optimzedLaunch=false)。

    关于spring-boot - 带有bootRun且未优化启动的Spring Boot应用程序(kotlin,gradle)中的性能低下= false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59784758/

    相关文章:

    java - 如何用 jetty.port 覆盖 jetty.xml

    gradle - 如何使用SerenityRunner和Gradle运行带有 'WithTagValuesOf'注释的特定测试

    Gradle:如何使任务依赖于环境变量?

    java - 如何从Spring boot连接到H2控制台?

    java - 加载 html 页面时出现 Thymeleaf TemplateInputException

    spring - Spring Boot with JOOQ 和 Spring Data JPA 之间的技术差异

    spring - 你能指定多个@Conditional 注释吗?

    java - 将 Spring Boot.war 部署到 tomcat 时无法启动组件 [StandardEngine[Catalina]]

    java - 从 osgi 包中导出和导入相同的包

    gradle - 将Gradle缓存复制到脱机系统中的问题