Skip to content

const和readonly哪个快?

*Effictive C#, 50 Specific Ways to Improve Your C#*一书提到,运行时常量readonly比编译时常量const更好。不是因为运行时常量readonly会比较快,而是因为这样的常量是运行时查找位置的,而不是编译时直接编译进IL,因此当版本出现交差覆盖的时候不会出错,也许会慢一点点,但是运行时常量readonly总是能够正确运行。 那么,运行时常量readonly到底比编译时常量const慢多少呢? 我写了个测试,框架就不介绍了。

using System; using System.Collections.Generic; using System.Text;

namespace CSharpPerformance.TestCase { class ReadOnlyVsConst : TestCase { private const double ConstValue = 1.23456789; private readonly double ReadOnlyValue = 1.23456789;

    private double DoCalculate(double value, long count)
    {
        double result = 1;
        for (int i = 0; i < count; i++)
        {
            result *= value;
        }
        return result;
    }

    public override void DoTest()
    {
        int count = 100000000;
        name1 = "Const:    ";
        DateTime start = DateTime.Now;
        DoCalculate(ConstValue, count);
        DateTime end = DateTime.Now;
        span1 = end.Subtract(start);

        name2 = "ReadOnly: ";
        start = DateTime.Now;
        DoCalculate(ReadOnlyValue, count);
        end = DateTime.Now;
        span2 = end.Subtract(start);
    }
}

}

我执行了10遍,结果是这样的: Debug模式(Optimize code: ON):

Const: 00:00:12.5802579 ReadOnly: 00:00:13.6913690

Const: 00:00:13.2063205 ReadOnly: 00:00:12.7162715

Const: 00:00:12.5372536 ReadOnly: 00:00:12.2612260

Const: 00:00:12.3152314 ReadOnly: 00:00:12.4542453

Const: 00:00:12.4342433 ReadOnly: 00:00:12.5922591

Const: 00:00:12.3752374 ReadOnly: 00:00:12.3442343

Const: 00:00:12.1912190 ReadOnly: 00:00:12.1782177

Const: 00:00:12.1932192 ReadOnly: 00:00:12.2582257

Const: 00:00:12.2472246 ReadOnly: 00:00:12.2532252

Const: 00:00:12.2462245 ReadOnly: 00:00:12.3122311

结果:const VS readonly:6:4

Debug模式(Optimize code: OFF):

Const: 00:00:12.4402439 ReadOnly: 00:00:12.3002299

Const: 00:00:12.2512250 ReadOnly: 00:00:12.2272226

Const: 00:00:12.2302229 ReadOnly: 00:00:12.1962195

Const: 00:00:12.2922291 ReadOnly: 00:00:12.2152214

Const: 00:00:12.3062305 ReadOnly: 00:00:12.1942193

Const: 00:00:12.2012200 ReadOnly: 00:00:12.2252224

Const: 00:00:12.1922191 ReadOnly: 00:00:12.2402239

Const: 00:00:12.2602259 ReadOnly: 00:00:12.2452244

Const: 00:00:12.2322231 ReadOnly: 00:00:12.1952194

Const: 00:00:12.2492248 ReadOnly: 00:00:12.1912190

结果:const VS readonly:2:8,Shocking!

Release模式(Optimize code: ON):

Const: 00:00:08.7728772 ReadOnly: 00:00:08.8708870

Const: 00:00:08.7698769 ReadOnly: 00:00:08.7088708

Const: 00:00:08.7148714 ReadOnly: 00:00:08.6878687

Const: 00:00:08.7258725 ReadOnly: 00:00:08.7758775

Const: 00:00:08.8258825 ReadOnly: 00:00:08.7748774

Const: 00:00:08.8948894 ReadOnly: 00:00:08.8378837

Const: 00:00:08.7198719 ReadOnly: 00:00:08.8348834

Const: 00:00:08.7338733 ReadOnly: 00:00:08.7398739

Const: 00:00:08.7138713 ReadOnly: 00:00:08.7688768

Const: 00:00:08.7948794 ReadOnly: 00:00:08.7698769

结果:const VS readonly:5:5

Release模式(Optimize code: OFF):

Const: 00:00:08.9068906 ReadOnly: 00:00:08.9008900

Const: 00:00:08.9108910 ReadOnly: 00:00:08.7988798

Const: 00:00:08.8098809 ReadOnly: 00:00:08.7978797

Const: 00:00:08.8048804 ReadOnly: 00:00:08.8218821

Const: 00:00:08.9528952 ReadOnly: 00:00:08.8898889

Const: 00:00:08.9138913 ReadOnly: 00:00:09.0019001

Const: 00:00:08.9288928 ReadOnly: 00:00:08.7968796

Const: 00:00:08.7798779 ReadOnly: 00:00:08.8298829

Const: 00:00:08.8258825 ReadOnly: 00:00:08.7558755

Const: 00:00:08.8138813 ReadOnly: 00:00:08.8168816

结果:const VS readonly:4:6

数数看,理论上const应该是绝对快的,其实不然。编译优化关闭的时候,const居然落后于readonly。