Object.GetType()的性能

我们的应用程序中有很多记录呼叫。我们的记录器采用System.Type参数,以便显示创建调用的组件。有时,当我们感到烦恼时,我们会做如下事情:

类Foo
{
私有静态只读类型myType=typeof(Foo);
void方法()
{
Logger.Log(myType,“SomeMethod已启动…”);
}
}

因为这只需要获取类型对象一次。然而,我们在这方面没有任何实际的指标。有人知道这比每次登录时调用this.GetType()节省了多少吗

(我意识到我可以自己做这些度量,没有什么大问题,但是嘿,StackOverflow是干什么的?)

我强烈怀疑GetType()将比任何实际的日志记录花费更少的时间。当然,您对Logger.Log的调用可能不会执行任何实际IO。。。不过,我仍然怀疑两者之间的区别是无关紧要的

编辑:基准代码位于底部。结果:

类型(测试):2756ms
测试类型(字段):1175ms
test.GetType():3734ms

这将调用该方法1亿次,优化将获得几秒钟左右的时间。我怀疑真正的日志记录方法还有很多工作要做,调用1亿次将花费比4秒长得多的时间,即使它没有写出任何内容。(当然,我可能错了——你得自己试一试。)

换句话说,和往常一样,我会选择可读性最好的代码,而不是进行微优化

使用系统;
使用系统诊断;
使用System.Runtime.CompilerServices;
课堂测试
{
const int迭代次数=100000000;
私有静态只读类型TestType=typeof(测试);
静态void Main()
{
int-total=0;
//确保它是JIT编译的
日志(类型(测试));
秒表sw=Stopwatch.StartNew();
对于(int i=0;i<迭代;i++)
{
总计+=对数(试验类型);
}
sw.Stop();
WriteLine(“typeof(Test):{0}ms”,sw.elapsedmillesons);
sw=秒表。开始新();
对于(int i=0;i<迭代;i++)
{
总计+=日志(测试类型);
}
sw.Stop();
WriteLine(“TestType(字段):{0}ms”,sw.elapsedmillesons);
测试=新测试();
sw=秒表。开始新();
对于(int i=0;i<迭代;i++)
{
total+=Log(test.GetType());
}
sw.Stop();
WriteLine(“test.GetType():{0}ms”,sw.elapsedmillesons);
}
//我怀疑你真正的日志方法不会被内联,
//让我们在这里模拟一下
[MethodImpl(MethodImplOptions.noInLine)]
静态int日志(类型)
{
返回1;
}
}

发表评论