然后预期奇怪的行为和beforefieldinit标志的性能问题

时间:2015-09-18 08:25:31

标签: c# clr lazy-initialization

我尝试了解 beforefieldinit 标志。 我写了两个简单的类

class Foo
{
    public static object o;
    static Foo()
    {
        o = new object();
    }
}

class Bar
{
    public static object o = new object();
}

然后在Main中我使用了两个类,并在调用任何代码之前为Main方法的第一个行设置了一个断点。 在Watch窗口中,我检查并看到了

  1. Foo.o为null
  2. Bar.o不为空
  3. 这有点奇怪,因为我认为标志的目的是懒惰 - 不想在实际需要之前初始化对象。 这也是关于here

    此行为的原因是什么,是否会影响性能?

    然后我想检查性能,所以我在Main中编写了以下代码:

    Stopwatch sw = new Stopwatch();
    sw.Start();
    
    for (int i = 0; i < 2000000000; i++)
    {
        object foosObject = Foo.o;
        if (foosObject == null)
        {
            Console.WriteLine("");
        }
    }
    
    sw.Stop();
    Console.WriteLine("With Static Ctor: " + sw.Elapsed);
    sw.Reset();
    
    sw.Start();
    
    for (int i = 0; i < 2000000000; i++)
    {
        object barsObject = Bar.o;
        if (barsObject == null)
        {
            Console.WriteLine("");
        }
    }
    
    sw.Stop();
    Console.WriteLine("Without Static Ctor: " + sw.Elapsed);
    sw.Reset();
    

    输出

      

    使用Static Ctor:00:00:06.0167153

         

    没有静态Ctor:00:00:04.2441007

    因此,性能差异 50%。为什么第一个循环运行得慢?我用ILDASM查看了IL,我没有看到任何差异

0 个答案:

没有答案