这个测试程序在 Windows Vista 操作系统的 .NET Framework 4 环境下的运行结果如下所示:
OS Version: Microsoft Windows NT 6.0.6002 Service Pack 2
CLR Version: 4.0.30319.1
Count: 500,990,730
Milliseconds: 181,886
CLR Version: 4.0.30319.1
Count: 500,990,730
Milliseconds: 181,886
将这个测试程序对 mask 变量是非静态的和静态的两种情况分别运行五次,得到的 Milliseconds 值如下表所示:
经过简单的计算得知,静态情况下比非静态情况下的平均运行效率提高了 7.7%,还是很可观的。
这个测试程序在 Ubuntu 10.10 操作系统的 mono 2.6.7 环境的运行结果如下所示:
经过简单的计算得知,静态情况下比非静态情况下的运行效率提高了 11.6%,更是有了较大的改进。
我们来看看这两种情况下 C# 编译器生成的 IL 代码,在非静态的情况下的该实例构造函数(.ctor)的 IL 代码:
001: .method public hidebysig specialname rtspecialname
002: instance void .ctor(uint8[] bits) cil managed
003: {
004: // 代码大小 181 (0xb5)
005: .maxstack 5
006: .locals init (uint8[] V_0,
007: bool V_1)
008: IL_0000: nop
009: IL_0001: ldarg.1
010: IL_0002: ldnull
011: IL_0003: ceq
012: IL_0005: ldc.i4.0
013: IL_0006: ceq
014: IL_0008: stloc.1
015: IL_0009: ldloc.1
016: IL_000a: brtrue.s IL_0017
017: IL_000c: ldstr "bits"
018: IL_0011: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
019: IL_0016: throw
020: IL_0017: ldarg.1
021: IL_0018: ldlen
022: IL_0019: conv.i4
023: IL_001a: ldc.i4.1
024: IL_001b: blt.s IL_0029
025: IL_001d: ldarg.1
026: IL_001e: ldlen
027: IL_001f: conv.i4
028: IL_0020: ldc.i4.s 9
029: IL_0022: cgt
030: IL_0024: ldc.i4.0
031: IL_0025: ceq
032: IL_0027: br.s IL_002a
033: IL_0029: ldc.i4.0
034: IL_002a: stloc.1
035: IL_002b: ldloc.1
036: IL_002c: brtrue.s IL_003e
037: IL_002e: ldstr "Invalid length"
038: IL_0033: ldstr "bits"
039: IL_0038: newobj instance void [mscorlib]System.ArgumentException::.ctor(string,
040: string)
041: IL_003d: throw
042: IL_003e: ldc.i4.8
043: IL_003f: newarr [mscorlib]System.Byte
044: IL_0044: dup
045: IL_0045: ldtoken field int64 '<PrivateImplementationDetails>
046: {78063CDC-E5EE-4C6B-A62D-FD0F919F6111}'::'$$method0x6000006-1'
047: IL_004a: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::
048: InitializeArray(class [mscorlib]System.Array,
049: valuetype [mscorlib]System.RuntimeFieldHandle)
050: IL_004f: stloc.0
051: IL_0050: ldarg.1
052: IL_0051: ldlen
053: IL_0052: conv.i4
054: IL_0053: ldc.i4.1
055: IL_0054: ble.s IL_0062
056: IL_0056: ldarg.1
057: IL_0057: ldlen
058: IL_0058: conv.i4
059: IL_0059: ldc.i4.s 9
060: IL_005b: clt
061: IL_005d: ldc.i4.0
062: IL_005e: ceq
063: IL_0060: br.s IL_0063
064: IL_0062: ldc.i4.1
065: IL_0063: stloc.1
066: IL_0064: ldloc.1
067: IL_0065: brtrue.s IL_0082
068: IL_0067: ldarg.1
069: IL_0068: ldc.i4.0
070: IL_0069: ldelema [mscorlib]System.Byte
071: IL_006e: dup
072: IL_006f: ldobj [mscorlib]System.Byte
073: IL_0074: ldloc.0
074: IL_0075: ldarg.1
075: IL_0076: ldlen
076: IL_0077: conv.i4
077: IL_0078: ldc.i4.1
078: IL_0079: sub
079: IL_007a: ldelem.u1
080: IL_007b: and
081: IL_007c: conv.u1
082: IL_007d: stobj [mscorlib]System.Byte
083: IL_0082: ldarg.1
084: IL_0083: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
085: IL_0088: nop
086: IL_0089: ldarga.s bits
087: IL_008b: ldc.i4.8
088: IL_008c: call void [mscorlib]System.Array::Resize<uint8>(!!0[]&,
089: int32)
090: IL_0091: nop
091: IL_0092: ldsfld bool [mscorlib]System.BitConverter::IsLittleEndian
092: IL_0097: stloc.1
093: IL_0098: ldloc.1
094: IL_0099: brtrue.s IL_00a2
095: IL_009b: ldarg.1
096: IL_009c: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
097: IL_00a1: nop
098: IL_00a2: ldarg.0
099: IL_00a3: ldarg.1
100: IL_00a4: ldc.i4.0
101: IL_00a5: call int64 [mscorlib]System.BitConverter::ToInt64(uint8[],
102: int32)
103: IL_00aa: call int64 Skyiv.Numerics.ZipInteger::Decode(int64)
104: IL_00af: stfld int64 Skyiv.Numerics.ZipInteger::data
105: IL_00b4: ret
106: } // end of method ZipInteger::.ctor
002: instance void .ctor(uint8[] bits) cil managed
003: {
004: // 代码大小 181 (0xb5)
005: .maxstack 5
006: .locals init (uint8[] V_0,
007: bool V_1)
008: IL_0000: nop
009: IL_0001: ldarg.1
010: IL_0002: ldnull
011: IL_0003: ceq
012: IL_0005: ldc.i4.0
013: IL_0006: ceq
014: IL_0008: stloc.1
015: IL_0009: ldloc.1
016: IL_000a: brtrue.s IL_0017
017: IL_000c: ldstr "bits"
018: IL_0011: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
019: IL_0016: throw
020: IL_0017: ldarg.1
021: IL_0018: ldlen
022: IL_0019: conv.i4
023: IL_001a: ldc.i4.1
024: IL_001b: blt.s IL_0029
025: IL_001d: ldarg.1
026: IL_001e: ldlen
027: IL_001f: conv.i4
028: IL_0020: ldc.i4.s 9
029: IL_0022: cgt
030: IL_0024: ldc.i4.0
031: IL_0025: ceq
032: IL_0027: br.s IL_002a
033: IL_0029: ldc.i4.0
034: IL_002a: stloc.1
035: IL_002b: ldloc.1
036: IL_002c: brtrue.s IL_003e
037: IL_002e: ldstr "Invalid length"
038: IL_0033: ldstr "bits"
039: IL_0038: newobj instance void [mscorlib]System.ArgumentException::.ctor(string,
040: string)
041: IL_003d: throw
042: IL_003e: ldc.i4.8
043: IL_003f: newarr [mscorlib]System.Byte
044: IL_0044: dup
045: IL_0045: ldtoken field int64 '<PrivateImplementationDetails>
046: {78063CDC-E5EE-4C6B-A62D-FD0F919F6111}'::'$$method0x6000006-1'
047: IL_004a: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::
048: InitializeArray(class [mscorlib]System.Array,
049: valuetype [mscorlib]System.RuntimeFieldHandle)
050: IL_004f: stloc.0
051: IL_0050: ldarg.1
052: IL_0051: ldlen
053: IL_0052: conv.i4
054: IL_0053: ldc.i4.1
055: IL_0054: ble.s IL_0062
056: IL_0056: ldarg.1
057: IL_0057: ldlen
058: IL_0058: conv.i4
059: IL_0059: ldc.i4.s 9
060: IL_005b: clt
061: IL_005d: ldc.i4.0
062: IL_005e: ceq
063: IL_0060: br.s IL_0063
064: IL_0062: ldc.i4.1
065: IL_0063: stloc.1
066: IL_0064: ldloc.1
067: IL_0065: brtrue.s IL_0082
068: IL_0067: ldarg.1
069: IL_0068: ldc.i4.0
070: IL_0069: ldelema [mscorlib]System.Byte
071: IL_006e: dup
072: IL_006f: ldobj [mscorlib]System.Byte
073: IL_0074: ldloc.0
074: IL_0075: ldarg.1
075: IL_0076: ldlen
076: IL_0077: conv.i4
077: IL_0078: ldc.i4.1
078: IL_0079: sub
079: IL_007a: ldelem.u1
080: IL_007b: and
081: IL_007c: conv.u1
082: IL_007d: stobj [mscorlib]System.Byte
083: IL_0082: ldarg.1
084: IL_0083: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
085: IL_0088: nop
086: IL_0089: ldarga.s bits
087: IL_008b: ldc.i4.8
088: IL_008c: call void [mscorlib]System.Array::Resize<uint8>(!!0[]&,
089: int32)
090: IL_0091: nop
091: IL_0092: ldsfld bool [mscorlib]System.BitConverter::IsLittleEndian
092: IL_0097: stloc.1
093: IL_0098: ldloc.1
094: IL_0099: brtrue.s IL_00a2
095: IL_009b: ldarg.1
096: IL_009c: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
097: IL_00a1: nop
098: IL_00a2: ldarg.0
099: IL_00a3: ldarg.1
100: IL_00a4: ldc.i4.0
101: IL_00a5: call int64 [mscorlib]System.BitConverter::ToInt64(uint8[],
102: int32)
103: IL_00aa: call int64 Skyiv.Numerics.ZipInteger::Decode(int64)
104: IL_00af: stfld int64 Skyiv.Numerics.ZipInteger::data
105: IL_00b4: ret
106: } // end of method ZipInteger::.ctor