一个简单的benchmark程序告诉你Spring依赖注入的性能有多好

开源老码农 发布于 2016/07/31 14:22
阅读 1K+
收藏 4

依赖注入是目前Java开发过程中经常遇到的情况。现在常用的依赖注入工具有:

  • Google Guice
  • SpringFramework
  • PicoContainer
  • Dagger

这其中个人观点是兼容JSR330标准的Guice易用性最好。SpringFramework历史非常悠久,有自己的一套依赖注入体系。Pico比较轻量,不过需要手工添加Bean类到容器,用起来有点烦。Dagger使用注解处理工具,其性能非常好,是一种很有前途的DI方案。另外还有两种运行时的DI方案也放进了这个测试当中:

Feather是超轻量级的方案,部分兼容JSR330标准,包括@Named注解。而Genie则是介于Feather和Guice之间的,相较于Feather提供了更多的特性,但不像Guice那么重。

下面是测试结果:

1. Injector初始化、装配一个bean object graph以及获取Bean实例:

Starting up DI containers & instantiating a dependency graph 4999 times:
---------------------------------------------------------------------------------------
Guice	 1613 ms
Feather	 106 ms
Dagger	 232 ms
Pico	 654 ms
Genie	 416 ms
Spring	 37520 ms

初始化和获取第一个Bean实例时间分开计算的情况:

Split Starting up DI containers & instantiating a dependency graph 4999 times:
---------------------------------------------------------------------------------------
Guice	 start: 642ms, fetch 1197ms
Feather	 start: 13ms, fetch 138ms
Dagger	 start: 98ms, fetch 215ms
Pico	 start: 228ms, fetch 365ms
Genie	 start: 359ms, fetch 197ms
Spring	 start: 33039ms, fetch 5072ms

2. 使用已有的Injector获取Bean实例:
Runtime benchmark, fetch bean for 499999 times:
--------------------------------------------------
Guice    559 ms
Feather  241 ms
Dagger   152 ms
Genie    162 ms
Pico     1946 ms
Spring   25809 ms

测试代码:https://github.com/greenlaw110/di-benchmark,此项目代码源自https://github.com/zsoltherpai/feather/tree/master/performance-test

如果感觉有问题的地方,欢迎提Issue,如有Pull请求更好。如果有其他DI方案的童鞋,也欢迎发送Pull请求 

加载中
0
李嘉图
李嘉图
关注一下,以后有机会了可以用用.
0
notreami
notreami
然而还是用Spring,汽车虽然没有飞机快,但是汽车容易改造和维修啊。。
0
开源老码农
开源老码农

引用来自“notreami”的评论

然而还是用Spring,汽车虽然没有飞机快,但是汽车容易改造和维修啊。。

仅就依赖注入而谈,Spring并不比其他几种方案简单易用。另外Spring在其中也是属于巨人级的,如果Spring是汽车的话,Guice算是摩托车,其他几种差不多算是自行车了

0
闲大赋
闲大赋

攒一个,在服务器领域,我觉得暂时难以用其他代替spring

0
yong9981
yong9981
发了一个Pull给你(加入我最近做的jBeanBox),感觉.Net里DI框架一大把,Java里就少多了,这个测试只是针对构造器测试,没有属性注入,有点简单了。
0
开源老码农
开源老码农

引用来自“yong9981”的评论

发了一个Pull给你(加入我最近做的jBeanBox),感觉.Net里DI框架一大把,Java里就少多了,这个测试只是针对构造器测试,没有属性注入,有点简单了。
 谢谢你的Pull请求。需要你把jBeanBox的源码从benchmark代码中抽取出来,使用POM来添加jBeanBox的依赖关系
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部