当我在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我有同样糟糕的结果
最佳答案
据我所知,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/