代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

在(假定的)高性能代码中使用getcurrentMethod

  •  6
  • Dan Tao  · 技术社区  · 16 年前

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

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

    我有一种可能被描述为对反省的非理性恐惧,我一直在努力控制这种恐惧。但是,在每秒可能执行100次的方法中,这样的调用与我有关。我不太了解思考;但从简要查看文档来看,我觉得我可以用以下内容替换:

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

    我的问题有三个方面:

    1. Me.GetType() 实际返回相同的 Type 作为 GetCurrentMethod().DeclaringType ?
    2. ME,GET类型() 实际上做任何事 不同地 getCurrentMethod()。声明类型 或者在引擎盖下做同样的事情?
    3. 我应该不担心这个吗?此应用程序的性能至关重要;程序 很好,但我们的业务性质是这样的,如果我们能在这里和那里削减几微秒,那是有用的。
    3 回复  |  直到 14 年前
        1
  •  8
  •   Daniel Brückner    16 年前

    在你的情况下 this.GetType() 将产生与 MethodBase.GetCurrentMethod().DeclaringType 做。 有关两个呼叫将返回不同类型的情况,请参见Jaredpar的回答。

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

    更新

    我只是用C来描述它#- 这是GET类型() 必修的 2.5 ns 每次通话时 methodBase.getCurrentMethod()。声明类型 必修的 2490 ns 每次通话-所以你可以加快大约 1200 .

    [Intel Core 2 6400 2.13 GHz 3.5 GiB WinXP Pro SP2.NET FX 3.5 SP1版本不带调试器]

        2
  •  14
  •   JaredPar    16 年前

    getType()是否返回as getcurrentMethod().declaringType?

    这要看情况而定。me.gettype将始终返回对象的实际类型。getCurrentMethod()。DeclaringType将返回在其中声明方法的类型。在继承场景中,这些值可能不同。

    考虑以下内容

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

    在方法foo中,如果处理的是c1的一个实例,两个表达式将相等。但如果是C2,他们会有所不同。

    getType()与getCurrentMethod()有什么不同吗。声明类型

    是的,这些是非常不同的功能。me.getType确定类的当前实例的运行时类型。getcurrentMethod.declaringType确定此方法声明的类型。

    我应该不担心这个吗?

    如果这是一个性能关键的场景,那么是的,您要确保配置您不理解的API。尤其是那些似乎涉及反思的人。但是只有一个分析器会告诉你哪一个更快。我的钱在我身上。不过,我要打字。

        3
  •  0
  •   Markus    14 年前

    我刚刚有了同样的问题,并找到了这个答案,但也许它不再是最新的,所以我张贴了我的测试结果…

    我不知道DOT NET Framework的早期版本,但在DOT NET Framework 4中,我得到了以下调用时间。所以性能不再是一个问题…

    • 首次调用methodBase.getCurrentMethod()。声明类型: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);