[英]Using GetCurrentMethod in (supposedly) high-performance code
出于记录目的,我们的应用程序中的一些方法包括以下行:
Dim Log As ILog = GetLog(Reflection.MethodBase.GetCurrentMethod().DeclaringType)
我有可能被描述为对反思的非理性恐惧,我试图控制它。 但是,在每秒执行一百次的方法中,这样的调用会引起我的注意。 我不太了解反思; 但是从简要介绍文档来看,我认为我可以用以下内容替换以下内容:
Dim Log As ILog = GetLog(Me.GetType())
我的问题有三方面:
Me.GetType()
实际返回相同Type
的GetCurrentMethod().DeclaringType
? 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确定此方法声明的类型。
如果这是一个性能关键的场景,那么您确定要分析您不理解的API。 特别是那些似乎涉及反思的人。 但只有剖析器会告诉你哪个明确更快。 我的钱在Me.GetType上。
在你的情况下
有关两个调用将返回不同类型的情况,请参阅JaredPar的答案。 this.GetType()
将产生与
MethodBase.GetCurrentMethod().DeclaringType
相同的结果
this.GetType()
可以。
在一般情况下,公开成员的类型(通过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。 所以表现不应该成为一个问题......
以下是生成此输出的代码:
_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.