IoC容器会带来什么性能开销?

9

松耦合当然很棒,但我经常想知道使用IoC容器(例如Castle Windsor)动态连接的开销与紧密耦合系统相比如何?

我知道详细的答案取决于IoC的用途,但我只是想了解IoC工作所需的努力程度。

有人有关于这方面的统计数据或其他资源吗?

谢谢


1
应用控制反转(IoC)后,希望您的系统不再紧密耦合。 ;) 我建议在系统的一部分上尝试它,如果性能很关键,请进行基准测试。我怀疑不会有显着的差异。大多数瓶颈涉及外部资源。 - TrueWill
我已经使用了IoC - 我只是想知道是否有人对此有任何信息。如果已经有人尝试过类似的事情,那么没有必要为了基准测试而重构我的应用程序以实现紧密耦合! - UpTheCreek
如果您想要市场上最快的IoC,请查看code.google.com/p/yadic,它是用F#编写的,适用于.Net和Java的Scala。它比Autofac lambda快3倍。 - Xian
如果这些统计数据正确的话,那么 Yadic 确实看起来非常快。 - UpTheCreek
这里有一个关于 IoC 容器的非常有趣的性能基准测试,链接地址为:http://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison。 - Steven
3个回答

10

以下是关于性能的链接:

http://realfiction.net/?q=node/143
  • 普通构建:0.0001 / 0.0002
  • 激活器构建:0.0069 / 0.0071
  • 容器构建(Castle Windsor):0.1014 / 0.1068
  • 容器构建(Spring.NET):0.069 / 0.0722

但是,如您所见,Windsor不是最快的IoC(Autofac更快)。

正确的答案是,性能并不重要 :).
因为在所有注册过程都处于初始化阶段时正确使用IoC。
换句话说,使用IoC必须减少实时中的“if else”次数。


2
是的,客户并不关心加载时间。 - Crashworks
@Crashworks,实际上,由于减少了实时性能,客户非常满意。 - Avram
@Crashworks,在你们这个(游戏)行业中,控制反转并没有什么帮助 :-D - Avram
有趣。如果我正确理解了realfiction上的帖子,通过IoC实例化任何对象需要比正常情况下慢大约1000倍吗?(测试中为0.1秒)我必须说这超出了我的预期。 - UpTheCreek
3
注意,这里有一万个实例。而大部分开销都用在了创建第一个实例上(包括解析XML和解决依赖关系)。对于很多任务而言,剩下的时间并不重要。 - elder_george

1

当容器启动时,你的初始化时间会变慢,因为所有东西都会被加载。如果初始化时间对你来说不重要,那么每个人在这个 chuck-a-luck 轮上都是赢家。


但是,根据Avrams帖子上的第一个链接,对象实例化时间似乎也要长得多? - UpTheCreek

1

了解IoC容器复杂程度的最佳方法是通过分析它。

在一次特殊的经历中,我花了一个下午使用 plexus(Maven基于此,这里有一个有用的链接可以浏览其源代码)来调试一些简单的“Hello World”代码。 通过查看defaultPlexusContainer,它似乎是:

  • 类路径配置(通过classworlds)
  • 创建运行时上下文变量(基本上是一个映射),以存储属性和变量
  • 配置解析(发现类路径上的模块元数据等)
  • 初始化:
    • 服务的构建/实例化
  • 触发额外的ComponentDiscoverers
  • 触发额外的ComponentDiscovererListeners
这留下了一个重要的方面,深入上述步骤:查找组件。在Plexus中,阶段概念包装了对象构建的步骤,这些阶段通常绑定到个性概念。然而,对于默认设置,这是通过执行以下阶段完成的:
  • 对象实例化(即new Object())
  • 日志启用(即为对象设置记录器)
  • 组合:即依赖项查找和设置
    • setter策略是一个有趣的点,但我现在会留下细节
  • 将上下文传递到创建的对象中
  • 对象附加启动过程
大多数这些步骤都是可选的,并且通常涉及识别给定接口并在目标对象上调用它 - 这是Plexus个性的默认设置,请注意。
此外,每个对象可能绑定到生命周期管理器,这主要区分新对象和单例对象。
在我的个人记录中:最困难的部分实际上是解析配置和启动容器。之后,您可能不会再注意到性能方面的任何差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接