背景:
我正在开发一个Spring Web应用程序,为用户提供优化算法。当在纯Java项目中执行时,我的算法的性能是可接受的。然而,在Spring项目中通过Rest控制器调用它会导致巨大的性能差距,我希望理解其中的原因。
测试/观察: 当然,所有测试都在相同的硬件上执行。 优化算法独立于Spring,即它接收一些基本的Java对象作为输入并返回结果。正如您在下表中所看到的,执行我的算法需要至少两倍于Spring内部执行,在5次迭代和100次迭代中(即开始没有恒定的开销)。
迭代[次数] 纯Java[ms] Spring[ms]
5 ~200 ~400 100 ~1400 3500-5000
我完全理解Web应用程序会在我的机器上产生一些开销(Spring、Angular等)。 但是,您真的希望有如此巨大的性能影响吗? 实际上,这只是一个小的测试数据集,现实世界的数据集将更具挑战性。
为了更详细地解释我如何进行测量:
我有一个Optimization类,其中包含一个public static Result optimize(Data data){}。 Data类是POJO,没有任何参考Spring实体的内容。
optimize()是一种演化算法,具有5或100个迭代。上面给出的时间仅在optimize()内部测量,但围绕着迭代循环使用System.currentTimeInMillis()。 因此,我的方法只被触发一次,但对不同数量的迭代执行,并且我只测量这些迭代在我的算法中所需的时间。
纯Java表示我创建了一个public static void main(String[] args),准备Data类并调用optimize()。
Spring表示我创建了一个Rest控制器,准备Data类并调用optimize()。
主要问题: 我非常感谢任何帮助更好地理解这个问题。目前,我正在思考以下问题:
测试/观察: 当然,所有测试都在相同的硬件上执行。 优化算法独立于Spring,即它接收一些基本的Java对象作为输入并返回结果。正如您在下表中所看到的,执行我的算法需要至少两倍于Spring内部执行,在5次迭代和100次迭代中(即开始没有恒定的开销)。
迭代[次数] 纯Java[ms] Spring[ms]
5 ~200 ~400 100 ~1400 3500-5000
我完全理解Web应用程序会在我的机器上产生一些开销(Spring、Angular等)。 但是,您真的希望有如此巨大的性能影响吗? 实际上,这只是一个小的测试数据集,现实世界的数据集将更具挑战性。
为了更详细地解释我如何进行测量:
我有一个Optimization类,其中包含一个public static Result optimize(Data data){}。 Data类是POJO,没有任何参考Spring实体的内容。
optimize()是一种演化算法,具有5或100个迭代。上面给出的时间仅在optimize()内部测量,但围绕着迭代循环使用System.currentTimeInMillis()。 因此,我的方法只被触发一次,但对不同数量的迭代执行,并且我只测量这些迭代在我的算法中所需的时间。
纯Java表示我创建了一个public static void main(String[] args),准备Data类并调用optimize()。
Spring表示我创建了一个Rest控制器,准备Data类并调用optimize()。
主要问题: 我非常感谢任何帮助更好地理解这个问题。目前,我正在思考以下问题:
- 什么因素会影响在Spring Rest Controller中执行方法的性能?
- 我是否可以配置Spring如何使用给定的硬件?
- 有没有其他替代方式可以从客户端访问算法,即一些替代Rest Controller的方式?
- 将我的算法以某种异步方式执行并稍后再次调用服务器以接收结果是否有帮助?
@RestController
时,肯定会有一些开销。但是,当触发optimize()
时,不应再涉及任何代理,对吗?这应该只是我创建的Java代码,对吗?那么性能差距从哪里来呢? - chrisb89