2016-01-31 29 views
3

该文档recommend注册通过lambda表达式作为频繁使用的组件...为什么lambda解决得更快?

这可以产生高达10个的速度更快Resolve()电话

现在的改善显然有几个问题:

  1. 为什么呢? (编辑:澄清:我会明白,如果注册时间上升,因为你现在必须使用反射来找到正确的构造函数等等,但为什么解决时间?)
  2. 在哪种情况下申请/注册课程的哪些方面使这个数字上升/哪些使其下降?
  3. 无论如何,我们一般都在谈论什么是解决时间?像“现在需要100个而不是10个cpu周期”,或者在“正常”用例(具有按请求生命期的Web服务)中实际可测量的数字?
+0

水泥混凝土实现总是比仿制药或反射更快。在通用用法上,很多反射正在使用的背景中。而且速度较慢。 在大多数正常情况下,您无法感受到其中的差异。你可以给它发信息。由于缓慢的影响,您应该经常避免使用反射或泛型,因此需要重用已使用的代码(如算法)。 但是:“过早优化是万恶之源”。让它起作用。如果需要的话,让它工作得很快。 – Ben

+0

@Ben是的,我意识到这一点,但我会认为这是花费在注册时间,而不是解决时间(因为一旦我找到了正确的构造函数 - 可以在注册时完成 - 我可以调用'''Activator .CreateInstance''')。这让我感到困惑。 – FrankyBoy

回答

3

正如在评论中指出的那样,简短的版本是具体的实现将比解析的反射方式更快。

深入考察,想想参与每一个步骤。

LAMBDA:

  1. 执行该方法。
  2. 没有第二步。

反思:

  1. 枚举所有构造函数的类型被实例化。这个列表可以被缓存,但已经被.NET框架很好地缓存了。
  2. 所有可用的构造函数中,计算出执行基于可用的构造参数的数量,并在容器中注册的类型是哪一个。注意在可以基于注册来源,寿命范围登记改变容器登记的类型等
  3. 解决的构造参数。如果有基于反射的注册组成构造参数,请递归地通过此过程运行它们。
  4. 使用已解析的参数调用选定的构造函数。

正如你看到的,实际上不仅仅是Activator.CreateInstance解决,这就是为什么它需要更长的时间的思考方式更多的工作。

但是,正如在评论中还指出,不用担心过早的优化。这一切都很快就会发生,因此请等待优化,直到使用探查器或类似工具实际找到瓶颈为止。

+0

嗨!感谢这个伟大的答案。考虑到第二点明确了为什么还有更多的工作正在进行,为什么在注册时无法完成。 关于3 - >当然,如果你需要解决任何问题,也适用于lambda表达式;) – FrankyBoy

+0

哦,关于过早优化:不用担心,我现在只是试图深入一点autofac(因为我们使用的方式它吮吸),偶然发现,并且只是好奇。我们有更多的领域需要首先考虑绩效。 – FrankyBoy

相关问题