我们的应用程序中有很多通话记录。我们的记录器使用System.Type参数,因此它可以显示哪个组件创建了调用。有时,当我们感到不安时,我们会执行以下操作:
class Foo
{
private static readonly Type myType = typeof(Foo);
void SomeMethod()
{
Logger.Log(myType, "SomeMethod started...");
}
}
因为这只需要一次获取Type对象。但是,我们对此没有任何实际指标。任何人都知道每次我们登录时调用this.GetType()可以节省多少费用?
(我意识到我可以自己做指标,没有大问题,但是,嘿,StackOverflow可以做什么?)
最佳答案
我强烈怀疑GetType()将比任何实际日志记录花费更少的时间。当然,您对Logger.Log的调用可能不会执行任何实际的IO ...我仍然怀疑两者之间的差异是否无关紧要。
编辑:基准代码在底部。结果:
typeof(Test): 2756ms
TestType (field): 1175ms
test.GetType(): 3734ms
这称为方法1亿次-优化获得了大约几秒钟的时间。我怀疑真正的日志记录方法还有很多工作要做,并且调用1亿次将花费总计4秒钟以上的时间,即使它没有写出任何东西。 (当然,我可能错了-您必须自己尝试一下。)
换句话说,像往常一样,我将使用可读性最高的代码,而不是进行微优化。
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
class Test
{
const int Iterations = 100000000;
private static readonly Type TestType = typeof(Test);
static void Main()
{
int total = 0;
// Make sure it's JIT-compiled
Log(typeof(Test));
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < Iterations; i++)
{
total += Log(typeof(Test));
}
sw.Stop();
Console.WriteLine("typeof(Test): {0}ms", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i = 0; i < Iterations; i++)
{
total += Log(TestType);
}
sw.Stop();
Console.WriteLine("TestType (field): {0}ms", sw.ElapsedMilliseconds);
Test test = new Test();
sw = Stopwatch.StartNew();
for (int i = 0; i < Iterations; i++)
{
total += Log(test.GetType());
}
sw.Stop();
Console.WriteLine("test.GetType(): {0}ms", sw.ElapsedMilliseconds);
}
// I suspect your real Log method won't be inlined,
// so let's mimic that here
[MethodImpl(MethodImplOptions.NoInlining)]
static int Log(Type type)
{
return 1;
}
}
关于c# - Object.GetType()的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/353342/