java - 在 Spring Rest Controller 中执行的方法明显比在纯 java 项目中慢

标签 java spring spring-boot

背景:
我正在开发一个为用户提供优化算法的 spring 网络应用程序。在纯 java 项目中执行时,我的算法的性能是可以接受的。但是,在 spring 项目中通过 rest Controller 调用它会导致巨大的性能差距,我想了解这一点。
测试/观察:
当然,所有测试都在同一硬件上执行。优化算法独立于 spring,即它接收一些基本的 java 对象作为输入并返回结果。正如您在下表中看到的,在 spring 中执行我的算法至少需要两倍的时间,它可以保持 5 次迭代和 100 次迭代(即开始时没有恒定的开销)。


迭代 [No.]
纯 Java [毫秒]
Spring [毫秒]


5
~200
~ 400

100
~1400
3500 - 5000


我完全理解 Web 应用程序会导致我机器上的一些开销( Spring 、角度等)。但是,您真的会期待如此巨大的性能影响吗?从本质上讲,这只是一个小的测试数据集,现实世界的数据集将更具挑战性。
为了更详细地解释我是如何测量的:

  • 我有一个 Optimization.class其中包含 public static Result optimize(Data data){} . Data.class是一个 POJO,没有任何对 spring 实体的引用。
  • optimize()是一种具有 5 或 100 次迭代的进化算法。以上给出的时间仅在optimize()内部测量但围绕迭代循环使用 System.currentTimeInMillis() .因此,我的方法只触发一次,但执行不同的迭代次数,我只测量算法中这些迭代需要多长时间。
  • Pure Java意味着我创建了一个 public static void main(String[] args)准备Data.class并调用 optimize() .
  • Spring意味着我创建了一个准备 Data.class 的休息 Controller 并调用 optimize() .

  • 主要问题:
    如果您能帮助我更详细地了解这个问题,我将不胜感激。目前我正在思考以下问题:
  • 哪些因素会影响在 Spring 架 Controller 内执行的方法的性能?
  • 我可以以某种方式配置 spring 使用给定硬件的方式吗?
  • 是否有任何替代方案可以从客户端访问算法,即其他 Controller 的替代方案?
  • 以某种异步方式执行我的算法并稍后再次调用服务器以接收结果是否有帮助?
  • 最佳答案

    在不知道您测量的确切方式的情况下,这些数字可能意味着完全为零(因为它们无关紧要)。
    如果您只是测量 5100执行时,您只测量了这些方法的“冷启动”,并且非常预期 Spring 明显更慢的事实;如果您知道 Spring 在幕后是如何工作的。 Spring 将为您的所有其余 Controller 方法创建代理,这些代理将位于 tomcat 下。在引擎盖下也是......为了简化我的意思,抛出 Exception在您的 @RestController看看堆栈跟踪——我想你会惊讶于它的深度。
    好消息是,一旦您多次调用这些休息方法,JVM将优化很多事情,并且调用将比您最初所做的要快得多。尽管如此,您永远无法击败简单的方法调用与通过 spring Controller 调用它。

    关于java - 在 Spring Rest Controller 中执行的方法明显比在纯 java 项目中慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67354467/

    相关文章:

    spring - 如何更新 cf vcaps env 中的 postgres uri 值

    java - ThreadPoolTask​​Executor 中的 ConcurrentModificationException 错误

    java - While 循环无法正常工作

    c# - 构建器模式 VS 我的实现

    java - 无法创建 SAAJ 元工厂 : Provider com. sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found

    spring - 如何将 CORS header 添加到 BasicErrorController 呈现的 Spring 错误页面?

    java - 运行带有参数的程序?

    java - 优化 Java 代码的技巧

    Spring 集成 HTTP 出站网关发布请求与 Java DSL

    java - 在独立应用程序中使用 Spring