.net 依赖注入启动性能

.net 依赖注入启动性能,.net,dependency-injection,benchmarking,.net,Dependency Injection,Benchmarking,最近,我被要求对使用Microsoft的复合UI应用程序块构建的应用程序中的一些性能问题进行故障排除,特别是加载时间太长 这是围绕Microsoft的ObjectBuilder依赖项注入框架构建的,该框架使用反射/属性来注册类。分析表明,在启动时,应用程序花费大量时间进行反射,因为ObjectBuilder在搜索要注册的内容时扫描每个加载程序集中的每个类型 其他DI框架似乎也都使用属性、XML配置或纯代码。 其他任何基于属性的框架似乎都不会更好,而且我对大量XML需要解析的启动时间持怀疑态度,等

最近,我被要求对使用Microsoft的复合UI应用程序块构建的应用程序中的一些性能问题进行故障排除,特别是加载时间太长

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

其他DI框架似乎也都使用属性、XML配置或纯代码。
其他任何基于属性的框架似乎都不会更好,而且我对大量XML需要解析的启动时间持怀疑态度,等等。
纯基于代码的框架似乎应该更快,但灵活性也要差得多,因此似乎没有明确的好选择

这导致我搜索DI容器基准,但我能找到的唯一基准是这一个:。
虽然这是一个很好的基准测试,但它只测量使用容器创建100万个对象的速度。我对创建100万个对象不感兴趣,我只是希望应用程序尽快启动,所以我要寻找的是关于DI容器启动成本的任何信息,无论是博客文章、轶事,甚至是像“这是一种让ObjectBuilder更快的方法”这样简单的东西


提前感谢

当所有程序集都已完成时,您是否尝试过测量启动时间?我发现(至少在IronScheme中),它在反射场景中有很大帮助(在我的例子中,从1.5秒到0.1秒)

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


至于这个缓存的性质,可能是对象被序列化到磁盘。正如“没有改变”的问题一样,启动程序可以查看校验和。

我不知道ObjectBuilder,但最近的依赖项注入框架通常支持延迟加载以提高启动性能。例如,请参见


或者你也可以像Ploeh的例子那样手动操作。

同意,很多时间都是由于每个类的JIT。就我所见,NGen对反射性能的影响微乎其微,而反射性能正是这种减速的原因。我没有尝试过NGen,但我不确定这是否是一个好主意——所讨论的应用程序是一个ClickOnce部署的客户端应用程序,不需要在GAC中进行NGEN吗?