1

当我在 junit 测试中运行我的函数时,我的时间比 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 时确实存在同样的问题,它也有很多计算。

更新2。使用 maven 我有同样的坏结果

  • 测试中 - 2ms
  • 在 gradle 中 isOptimizedLaunch = false - 2ms
  • 在没有 isOptimizedLaunch = false 的 gradle 中 - 5245ms
  • 在 Maven 中 - 5146ms
4

1 回答 1

0

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

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

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

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

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

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

于 2020-01-20T14:01:44.020 回答