想在项目中大量使用依赖注入,故对其性能做了一个测试。
测试使用spring.net和微软企业库(Enterprise Library 4.1)来做依赖注入。
测试场景:
- 简单构造函数
- 对同一个对象生成10000次。
- 单例模式下,取得对象10000次。
- 复杂构造函数
- 对同一个对象生成10000次。
- 单例模式下,取得对象10000次。
测试环境:
cpu:Q9500
内存:4G
操作系统:windows7
spring.net: 1.20
Enterprise Library 4.1
测试方式:
每个场景单纯测试,排除相互影响,每次测试运行3次,取平均值。
测试结果:
简单构造函数,取对象运行1万次
单例模式下加载时间对比
不使用IOC |
spring |
企业库 |
|||||||
加载容器 |
无 |
105 |
101 |
102 |
AVG 102.667 |
83 |
82 |
82 |
AVG 82.333 |
取得对象 |
无 |
4 |
4 |
4 |
AVG 4 |
56 |
56 |
57 |
AVG 56.333 |
总时间 |
无 |
109 |
105 |
106 |
AVG 106.667 |
139 |
138 |
140 |
AVG 139 |
非单例模型下
不使用IOC |
spring |
企业库 |
|||||||
加载容器 |
无 |
86 |
88 |
88 |
AVG 87.333 |
76 |
76 |
78 |
AVG 76.667 |
取得对象 |
0 |
62 |
66 |
60 |
AVG 62.667 |
59 |
60 |
57 |
AVG 58.667 |
总时间 |
0 |
149 |
154 |
148 |
AVG 150.333 |
136 |
136 |
135 |
AVG 135.667 |
复杂构造函数,取对象运行1万次
单例模式下加载时间对比
不使用IOC |
spring |
企业库 |
|||||||
加载容器 |
无 |
100 |
101 |
101 |
AVG 101.667 |
81 |
80 |
81 |
AVG 80.667 |
取得对象 |
无 |
5 |
4 |
4 |
AVG 4.333 |
56 |
56 |
57 |
AVG 56.333 |
总时间 |
无 |
105 |
105 |
106 |
AVG 105.667 |
138 |
137 |
138 |
AVG 137.667 |
非单例模型下
不使用IOC |
spring |
企业库 |
|||||||
加载容器 |
无 |
88 |
87 |
87 |
AVG 87.333 |
76 |
77 |
77 |
AVG 76.667 |
取得对象 |
36 |
96 |
99 |
99 |
AVG 98 |
93 |
95 |
95 |
AVG 94.333 |
总时间 |
36 |
185 |
186 |
186 |
AVG 185.667 |
169 |
172 |
172 |
AVG 171 |
数据分析
- l 容器的加载,企业库要比spring快大约10-20微秒。
- l 获取对象在单例模式下,企业库比spring慢大约50微秒/10000次。(每次大约0.005微秒)
- l 获取对象在单例模式下,spring注入只需要4-5微秒/10000次。 (每次大约0.0005微秒)
- l 获取对象在非单例模式下, 属性注入比不使用相差50微秒/10000次。(每次大约0.005微秒)
总结
两种依赖注入方式性能不存在太多差异。即使在执行一万次的情况下,也不会超过50微秒,实际使用中我们可以完全忽略不计。
依赖注入比直接实例化会慢50微秒/10000次,在单例模式用spring的情况下只慢50微秒/10000次,实际使用中我们也可以完全忽略不计。
总得来说,依赖注入可以放心使用,对系统性能产生影响可以忽略不计。