我们的应用程序中有很多通话记录。我们的记录器使用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/

10-13 00:56