Spring 大大降低了 Optaplanner 求解器的分数评估速度

Spring drastically slows down score evaluation speed of Optaplanner solver

我有如下一段代码

@SpringBootApplication
public class ServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);

        OptimalTerminationTimeFinder.findOptimalTerminationTime(
            8,
            10,
            50,
            Duration.ofSeconds(1),
            Duration.ofMillis(250));
}

其中 OptimalTerminationFinder 解决了数百个问题并尝试找到给定问题大小的最佳终止时间。

问题是当我评论注释@SpringBootApplication时,分数评估速度从40k增加到80k,反之亦然。

为什么 Spring 会大大降低求解器的速度?我阅读了 user guide 的 Spring,唯一的区别是他们使用 SolverManager 但这不是问题,是吗?我只是使用 Solver class.

我无法承受 Spring 如此剧烈的速度下降 - 时差在制作中至关重要。

我用 java-spring-boot quickstart 重现了性能差异。

我相信较慢的计算速度是由 running the application 使用 spring-boot-maven-plugin 引起的(我假设如果您尝试 运行一个@SpringBootApplication注解class).

如果您首先 build an executable JAR 您的项目,然后 运行 在您的 IDE 中或使用 java -jar ... 从终端中获取 JAR,您将看到完整的速度分数计算。

我没有解释为什么 Spring Boot Maven 插件会阻止完整的性能,但您的应用程序的生产构建不会受到影响。

我打赌是日志记录。默认情况下,它们可能在 spring 和普通 java 之间有所不同(因此 Yurloc 的回答是正确的)。检查两次运行的日志记录级别和附加程序。

我看到分数计算速度下降了 2 倍或更多:

  • 类别 org.optaplannerDEBUGTRACE 日志记录可以下降 4 倍。这取决于。
  • 类别 org.optaplannerINFODEBUG 的日志记录可能会下降 2 倍。这取决于。
  • 类别 org.droolsWARNDEBUG 可以下降 10 倍。这取决于。
  • consolefile 日志记录的 Appender 可以下降 2 倍。这取决于。