2009-01-22 58 views
10

我最近被要求排除使用微软复合UI应用程序块构建的应用程序中的一些性能问题 - 特别是加载时间过长。依赖注入启动性能

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

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

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

在此先感谢

回答

3

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

+0

同意了,很多时候是由于每个班的JIT。 – 2009-01-22 03:02:58

0

在使其更快...

我想有可能是缓存启动的结果的方式。也许应用程序花费更多的时间来完成反射,然后缓存结果,但在第二次启动时,如果没有任何变化,您可以从缓存中加载(可能会更快)。

至于这个缓存的性质,可能是对象被序列化到磁盘。作为“没有改变”的问题,创业公司可以看看支票。

0

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

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