- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我正在开发一个为用户提供优化算法的 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()
. 最佳答案
在不知道您测量的确切方式的情况下,这些数字可能意味着完全为零(因为它们无关紧要)。
如果您只是测量 5
和 100
执行时,您只测量了这些方法的“冷启动”,并且非常预期 Spring 明显更慢的事实;如果您知道 Spring 在幕后是如何工作的。 Spring 将为您的所有其余 Controller 方法创建代理,这些代理将位于 tomcat
下。在引擎盖下也是......为了简化我的意思,抛出 Exception
在您的 @RestController
看看堆栈跟踪——我想你会惊讶于它的深度。
好消息是,一旦您多次调用这些休息方法,JVM
将优化很多事情,并且调用将比您最初所做的要快得多。尽管如此,您永远无法击败简单的方法调用与通过 spring Controller 调用它。
关于java - 在 Spring Rest Controller 中执行的方法明显比在纯 java 项目中慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67354467/
通常当我请求线程转储时,系统性能不佳的症状很容易解释;也就是说,通常我会看到许多线程显然正在等待一个已被获取但未被另一个释放的监视器。 在这种情况下,我有很多线程在等待监视器 (0x965ad100)
C:\Users\shagy\Desktop\3RD YEAR 2ND SEMESTER\SPM\Newfolder\SPM-SMS>npm start npm ERR! path C:\Users\
我是一名优秀的程序员,十分优秀!