依赖注入启动性能

时间:2009-01-22 02:26:26

标签: .net dependency-injection benchmarking

我最近被要求解决使用Microsoft的Composite UI Application块构建的应用程序中的一些性能问题 - 特别是加载时间过长。

这是围绕Microsoft的ObjectBuilder依赖注入框架构建的,该框架使用反射/属性来注册类。分析表明,在启动时,应用程序花费了大量时间进行反射,因为ObjectBuilder会扫描每个已加载程序集中的每个类型,以搜索要注册的内容。

替代DI框架似乎也使用属性,XML配置或纯代码 似乎任何其他基于属性的框架都不会更好,而且我对启动时间也要怀疑,因为还需要解析成堆的XML等。
基于纯代码的框架看起来应该更快,但是它们的灵活性也差得多,所以它看起来并不是一个明确的好选择......

这导致我搜索DI容器基准测试,但我能找到的唯一一个是http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html。 虽然它是一个很好的基准,但它只测量使用容器创建100万个对象的速度。我没有兴趣创建100万个对象,我只是希望应用程序尽快启动,所以我正在寻找的是有关DI Container 启动成本的任何信息,无论是博客文章,轶事,甚至是“这里可以让ObjectBuilder更快”的简单方法。

提前致谢

3 个答案:

答案 0 :(得分:3)

您是否尝试过测量所有组件已经过NGEN的启动时间?我发现(至少在IronScheme中),它在反射场景中有很多帮助(在我的情况下从1.5秒到0.1秒)。

答案 1 :(得分:0)

加快速度......

我在想,可能有办法缓存启动结果。也许应用程序花费更多时间来进行反射然后缓存结果,但是,在第二次启动时,如果没有任何更改,您可以从缓存加载(这可能更快)。

至于此缓存的性质,可能是对象被序列化为磁盘。作为“没有改变”的问题,创业公司可以查看校验和。

答案 2 :(得分:0)

我不了解ObjectBuilder,但最近的依赖注入框架通常支持延迟加载以提高启动性能。例如,请参阅Lazing Around with Autofac2

或者你可以像在Ploeh的LazyOrderShipper示例中那样手动完成。