技术开发 频道

详谈C# 语言中的 static 关键字

  这个测试程序在 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

 

  将这个测试程序对 mask 变量是非静态的和静态的两种情况分别运行五次,得到的 Milliseconds 值如下表所示:

1
 

  经过简单的计算得知,静态情况下比非静态情况下的平均运行效率提高了 7.7%,还是很可观的。

  这个测试程序在 Ubuntu 10.10 操作系统的 mono 2.6.7 环境的运行结果如下所示:

1
 

  经过简单的计算得知,静态情况下比非静态情况下的运行效率提高了 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

 

0
相关文章