想在项目中大量使用依赖注入,故对其性能做了一个测试。
测试使用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次,实际使用中我们也可以完全忽略不计。
总得来说,依赖注入可以放心使用,对系统性能产生影响可以忽略不计。
测试源码下载:http://download.csdn.net/source/1798686