10

我最近被要求解决使用 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 更快的方法”一样简单。

提前致谢

4

3 回答 3

3

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

于 2009-01-22T03:01:11.420 回答
0

关于让它更快...

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

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

于 2010-12-22T15:45:25.710 回答
0

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

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

于 2010-12-22T17:56:10.667 回答