在(据说)高性能的代码使用GetCurrentMethod(Using GetCurrentMeth

2019-07-19 04:05发布

为了记录的目的,在我们的应用程序的一些方法包括以下行:

Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().DeclaringType)

我有什么可以被描述为反射的非理性的恐惧,我尽量保持在检查。 然而,呼吁像这样有潜在的执行百倍第二个问题我的方法。 我不知道像我大概应该反思; 但是从资料上简单看,它看起来对我来说,我可以替换为以下:

Dim Log As ILog = GetLog(Me.GetType())

我的问题是三个方面:

  1. 是否Me.GetType()实际返回相同TypeGetCurrentMethod().DeclaringType
  2. 是否Me.GetType()实际上是从做任何事情, 不同的 GetCurrentMethod().DeclaringType呢,还是做引擎盖下是一回事吗?
  3. 我应该甚至不担心这个呢? 性能在此应用中至关重要的; 该程序运行正常,但我们的业务性质是这样的,如果我们能够在这里和那里刮掉甚至几微秒,这是非常有用的。

Answer 1:

在您的情况this.GetType()会产生相同的结果MethodBase.GetCurrentMethod().DeclaringType一样。 请参阅JaredPar的答案的情况下都调用将返回不同的类型。

在一般情况下的类型曝光的部件(经由获得MemberInfo.ReflectedType属性)和声明一个构件(通过所获得的类型MemberInfo.DeclaringType属性)可以不同。

UPDATE

我只是用C#异形它- this.GetType()需要2.5 ns每通电话的同时MethodBase.GetCurrentMethod().DeclaringType需要2490 ns每次通话-让你拥有约因子加速1200

[英特尔酷睿2 6400 2.13 GHz的| 3.5吉布| 的WinXP专业版SP2 | .NET FX 3.5 SP1 | 发布| 如果没有调试器]



Answer 2:

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

这取决于。 Me.GetType总是返回的实际类型的对象。 GetCurrentMethod()。DeclaringType将返回其声明的方法类型。 这些值可以在继承的情况不同。

考虑以下

Class C1
  Public Sub Foo() 
    ..
  End Sub
End Class
Class C2 
  Inherits C1
  ..
End Class

里面foo方法,如果你正在处理C1的一个实例的两个表达式是相等的。 但如果是C2,他们会有所不同。

是否Me.GetType()做任何事情不同于GetCurrentMethod()。DeclaringType

是的,这些都是非常不同的功能。 Me.GetType确定类别的当前实例的运行时类型。 GetCurrentMethod.DeclaringType决定了这个方法声明什么类型。

我应该甚至不担心这个呢?

如果这是一个性能的关键场景则是你要确保您的个人资料,你不明白的API。 尤其是那些似乎涉及反射。 但是,只有一个分析器会告诉你,这是确实快。 我的钱是Me.GetType虽然。



Answer 3:

我只是有同样的问题,找到这个答案,但也许这是不是最新的更多,所以我后我testresults ...

我不知道该点.Net框架的早期版本,但在点.NET框架4我碰到下面的呼叫次数。 所以性能不应该是一个问题的任何更多...

  • 第一次调用MethodBase.GetCurrentMethod()DeclaringType:0毫秒 - 221只蜱。
  • 第一次调用this.GetType():0毫秒 - 225只蜱

下面是其中产生该输出的代码:

        _txtReport.Text = string.Empty;
        var sw = new Stopwatch();

        sw.Start();
        var type = MethodBase.GetCurrentMethod().DeclaringType;
        sw.Stop();

        _txtReport.Text += string.Format("First Call to MethodBase.GetCurrentMethod().DeclaringType: {0} ms - {1} ticks{2}",
                                         sw.ElapsedMilliseconds, sw.ElapsedTicks, Environment.NewLine);

        sw.Start();
        var type1 = this.GetType();
        sw.Stop();

        _txtReport.Text += string.Format("First Call to this.GetType(): {0} ms - {1} ticks{2}",
                                         sw.ElapsedMilliseconds, sw.ElapsedTicks, Environment.NewLine);


文章来源: Using GetCurrentMethod in (supposedly) high-performance code