首页 > 解决方案 > 在 Spring Rest Controller 中执行的方法比在纯 java 项目中执行的方法要慢得多

问题描述

背景: 我正在开发一个为用户提供优化算法的 Spring Web 应用程序。在纯 java 项目中执行时,我的算法的性能是可以接受的。但是,通过 spring 项目中的休息控制器调用它会导致我想理解的巨大性能差距。

测试/观察: 当然,所有测试都在同一硬件上执行。优化算法独立于spring,即它接收一些基本的java对象作为输入并返回一个结果。正如您在下表中看到的,执行我的算法至少需要两倍的时间在 spring 内部,它可以保持 5 次迭代和 100 次迭代(即开始时没有恒定的开销)。

迭代次数 [No.] 纯 Java [毫秒] 弹簧 [毫秒]
5 ~200 ~ 400
100 ~1400 3500 - 5000

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

为了更详细地解释我是如何测量这个的:

主要问题: 我非常感谢任何有助于更详细地理解这个问题的帮助。目前我正在考虑以下问题:

标签: javaspringspring-boot

解决方案


在不知道您测量的确切方式的情况下,这些数字可能意味着完全为零(因为它们与它们的含义无关)。

如果你只是测量5100执行,你只测量了那些方法的“冷启动”,Spring 明显慢的事实是非常值得期待的;如果您知道 Spring 是如何在幕后工作的。Spring 将为您的所有休息控制器方法创建代理,这也将tomcat在引擎盖下进行...为了简化我的意思,将一个Exception放入您的@RestController并查看堆栈跟踪 - 我认为您会对它的深度感到惊讶.

好消息是,一旦你对这些 rest 方法进行了多次JVM调用,就会优化很多东西,并且调用会比你最初做的快得多。尽管如此,您将永远无法击败简单的方法调用与通过弹簧控制器调用它。


推荐阅读