在(据称)高性能代码中使用GetCurrentMethod

Dan*_*Tao 6 .net vb.net reflection performance gettype

出于记录目的,我们的应用程序中的一些方法包括以下行:

Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Run Code Online (Sandbox Code Playgroud)

我有可能被描述为对反思的非理性恐惧,我试图控制它.但是,在每秒执行一百次的方法中,这样的调用会引起我的注意.我不太了解反思; 但是从简要介绍文档来看,我认为我可以用以下内容替换以下内容:

Dim Log As ILog = GetLog(Me.GetType())
Run Code Online (Sandbox Code Playgroud)

我的问题有三方面:

  1. 是否Me.GetType()实际上返回相同TypeGetCurrentMethod().DeclaringType
  2. 是否Me.GetType()实际上做任何事情不同GetCurrentMethod().DeclaringType,或者是做引擎盖下是一回事吗?
  3. 我根本不应该担心这个吗?性能在此应用中至关重要; 该程序运行良好,但我们的业务性质是这样的,如果我们可以在这里和那里削减甚至几微秒,这是有用的.

Jar*_*Par 14

Me.GetType()是否返回GetCurrentMethod().DeclaringType?

这取决于.Me.GetType将始终返回对象的实际类型.GetCurrentMethod().DeclaringType将返回声明方法的类型.这些值在继承方案中可能不同.

考虑以下

Class C1
  Public Sub Foo() 
    ..
  End Sub
End Class
Class C2 
  Inherits C1
  ..
End Class
Run Code Online (Sandbox Code Playgroud)

在内部方法Foo中,如果您正在处理C1的实例,则两个表达式将相等.但如果它是C2,它们将是不同的.

Me.GetType()与GetCurrentMethod()做什么不同.DeclaringType

是的,这些是非常不同的功能.Me.GetType确定类的当前实例的运行时类型.GetCurrentMethod.DeclaringType确定此方法声明的类型.

我根本不应该担心这个吗?

如果这是一个性能关键的场景,那么您确定要分析您不理解的API.特别是那些似乎涉及反思的人.但只有剖析器会告诉你哪个明确更快.我的钱在Me.GetType上.


Dan*_*ner 8

在你的情况下this.GetType()将产生与之相同的结果MethodBase.GetCurrentMethod().DeclaringType.有关两个调用将返回不同类型的情况,请参阅JaredPar的答案.

在一般情况下,暴露成员(通过MemberInfo.ReflectedType属性获得)的类型和声明成员(通过MemberInfo.DeclaringType属性获得)的类型可能不同.

UPDATE

我只是用C#异形它- this.GetType()需要2.5 ns每次通话的同时MethodBase.GetCurrentMethod().DeclaringType需要2490 ns每次通话-所以你对因子的加快1200.

[Intel Core 2 6400 2.13 GHz | 3.5 GiB | WinXP Pro SP2 | .NET FX 3.5 SP1 | 发布| 没有调试器]