繁体   English   中英

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

[英]Using GetCurrentMethod in (supposedly) high-performance code

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

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. 我根本不应该担心这个吗? 性能在此应用中至关重要; 该程序运行良好,但我们的业务性质是这样的,如果我们可以在这里和那里削减甚至几微秒,这是有用的。

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上。

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

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

UPDATE

我只是使用C#来描述它 - this.GetType()每次调用需要2.5 ns ,而MethodBase.GetCurrentMethod().DeclaringType每次调用需要2490 ns this.GetType() - 所以你的速度大约是因子1200

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

我刚才有同样的问题,并找到了这个答案,但也许它不是最新的,所以我发布我的测试结果......

我不知道dot net Framework的早期版本,但在dot net Framework 4中,我得到以下调用Times。 所以表现不应该成为一个问题......

  • 首先调用MethodBase.GetCurrentMethod()。DeclaringType:0 ms - 221 ticks
  • 首先调用this.GetType():0 ms - 225 ticks

以下是生成此输出的代码:

        _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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM