spring 性能的疑问

2019-11-26 14:43:35 +08:00
 Yuicon
最近在性能优化,今天在测试的时候发现:
我自己 new 的类调用方法只要 0.0001ms
通过 spring 管理自动注入的方式,调用同样的方法就要 200-300ms????
为了排除干扰方法内容都注释了直接返回 null
2874 次点击
所在节点    程序员
15 条回复
Yuicon
2019-11-26 14:46:00 +08:00
有大神知道原因么,看到自己接口只有 20 不到的 qps,我急啊
fkdog
2019-11-26 14:46:10 +08:00
因为 spring 注入的类都是通过 cglib 之类的字节码框架增强代理过的,经过反射之类的机制性能肯定会下降。
但是 200-300ms 就有点夸张了。
你确定不是其他地方有干扰。
Yuicon
2019-11-26 14:48:06 +08:00
@fkdog 排除了干扰 方法里没有内容 直接返回 null 了 强制使用 cglib 不用接口代理 也是一样的慢
lhx2008
2019-11-26 14:50:10 +08:00
我不知道你是从哪里算起,如果是 HTTP 算起,你可以拋异常看一下调用栈有多深,这个速度也很正常
Yuicon
2019-11-26 14:51:01 +08:00
@lhx2008 jmh 本地测的 直接调的 service
sagaxu
2019-11-26 14:53:57 +08:00
正常几万 QPS 还是有的,框架本身消耗不大
Yuicon
2019-11-26 14:58:43 +08:00
@sagaxu 我测了下 redis 只有 1ms 的消耗 但是被 bean 的方法一包 一下就 2-300ms 的速度了 那些几万 qps 的都是不用 spring 的么
passerbytiny
2019-11-26 15:00:22 +08:00
cglib 或者对象代理,应该也只是初始化 Bean 的时候慢,反射机制虽然慢一点,但这个慢只是略微慢,不做针对性测试可能就测不出来。

我能想到的有两个原因:一,配置了切面,切面慢;二,bean 不是单例模式,每次都会初始化。
Yuicon
2019-11-26 15:21:42 +08:00
@passerbytiny 确实是你说的切面的问题,我才发现在类级别配置了事务 去掉后就是正常的 0.00001ms 了
huhujin
2019-11-26 15:43:05 +08:00
spirng 的 bean 只是在初始化的 时候 一般单例初始化好了.调用 就算经过几个 aop 也不慢很多.200ms 都是 api 返回的速度; 和代码执行不是一个数量级的.
Yuicon
2019-11-26 15:49:50 +08:00
@sagaxu qps 都是怎么统计出来的?在本地直接测么?放服务器感觉有网络延迟快不起来啊
sagaxu
2019-11-26 15:51:56 +08:00
@Yuicon 延迟不会降低 QPS,每个请求需要 1 秒也可以几万 QPS
gz911122
2019-11-26 15:52:23 +08:00
感觉你测错了...
bean 的注入是注入时的耗时,调用时是正常的..

所以原因如 8L 说
一,配置了切面,切面慢;二,bean 不是单例模式,每次都会初始化。
LuckyBoyGirl
2019-11-26 15:59:21 +08:00
调用 spring 注入以后,再调用一次试试,看看多长时间
Yuicon
2019-11-26 16:09:16 +08:00
@LuckyBoyGirl 问题是事务的锅,去掉后就没问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/623277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX