摘要 对可执行的应用程序,它的生命是从Load开始的,一个.NET 的程序,某种程度上可以说它的生命是从加载类型开始的。本文阐述了在.NET CF中的Type Loader的工作原理,并结合示例说明了如何让您的应用程序启动更快。 Keywords .NET Compact Framework,Type Loader, JIT ,Generic,Dictionary
1. 设备不能承受之慢
等待是很痛苦的,让用户等待是不人道的。现在PC机上的程序也许感觉不是很明显,因为桌面计算机性能普遍较佳,而且一般的应用程序不会涉及海量数据的运算,日常的程序即使有性能上的某些缺陷,用户也不会明显的察觉到。
然而在CPU处理能力和内存均有限的移动设备上,计算机的工作能力就没有那么可观了。也许一个简单的程序就能让你的设备陷入肉眼就能识别的性能危机。设想一下用户怀着愉悦的心情在你的程序中选择了一个菜单项,但是他那台不怎么样的设备却需要反应数十秒,用户也只能望着屏幕中央不断旋转的光标兴叹了,这无疑对用户来说是一个打击,软件开发人员更是颜面无光。
好吧,下面我们就来看看下面一个简单的程序是如何折腾你的CLR的,虽然我刻意将它极端化了一点点J
public partial class Form1 : Form
 {
public Form1()
 {
InitializeComponent();

int[] r = new int[6];
int n = 0;

 安置一些计时的环节,并调用funcX()触发Type Loader#region 安置一些计时的环节,并调用funcX()触发Type Loader
r[n++] = func0(Environment.TickCount);
r[n++] = func1(Environment.TickCount);
r[n++] = func2(Environment.TickCount);
r[n++] = func3(Environment.TickCount);
r[n++] = func4(Environment.TickCount);
r[n++] = func5(Environment.TickCount);
#endregion

//将结果保存到本地文本文件中
using (StreamWriter writer = new StreamWriter(@"\Temp\LoaderPerf.txt", false))
 {
for (int i = 0; i < n; ++i) writer.WriteLine(r[i]);
}
}

 /**//// <summary>
/// 返回一个整型值,单位为毫秒
/// 指示从Type Load开始到方法开始执行的时间差
/// </summary>
/// <returns>初始化类型所耗费的时间(毫秒)</returns>
public static int func0(int start)
 {
int diff = Environment.TickCount - start;
Maps0.func();
return diff;
}

 与func0一致的其他五个方法#region 与func0一致的其他五个方法

public static int func1(int start)
 {
int diff = Environment.TickCount - start;
Maps1.func();
return diff;
}

public static int func2(int start)
 {
int diff = Environment.TickCount - start;
Maps2.func();
return diff;
}

public static int func3(int start)
 {
int diff = Environment.TickCount - start;
Maps3.func();
return diff;
}

public static int func4(int start)
 {
int diff = Environment.TickCount - start;
Maps4.func();
return diff;
}

public static int func5(int start)
 {
int diff = Environment.TickCount - start;
Maps5.func();
return diff;
}

#endregion
}

 /**//// <summary>
/// 定义了一个有些夸张的类
/// 它定义了5个枚举5个泛型字典并做了初始化
/// </summary> public static class Maps0
 {
 public enum Enum1 { i1, }
 public enum Enum2 { i1, }
 public enum Enum3 { i1, }
 public enum Enum4 { i1, }
 public enum Enum5 { i1, }
private static readonly Dictionary<Enum1, int> map1 = new Dictionary<Enum1, int>();
private static readonly Dictionary<Enum2, int> map2 = new Dictionary<Enum2, int>();
private static readonly Dictionary<Enum3, int> map3 = new Dictionary<Enum3, int>();
private static readonly Dictionary<Enum4, int> map4 = new Dictionary<Enum4, int>();
private static readonly Dictionary<Enum5, int> map5 = new Dictionary<Enum5, int>();
 public static void func() { }
}

 与Maps0一样的其他五个类#region 与Maps0一样的其他五个类

public static class Maps1
 {
 public enum Enum1 { i1, }
 public enum Enum2 { i1, }
 public enum Enum3 { i1, }
 public enum Enum4 { i1, }
 public enum Enum5 { i1, }
private static readonly Dictionary<Enum1, int> map1 = new Dictionary<Enum1, int>();
private static readonly Dictionary<Enum2, int> map2 = new Dictionary<Enum2, int>();
private static readonly Dictionary<Enum3, int> map3 = new Dictionary<Enum3, int>();
private static readonly Dictionary<Enum4, int> map4 = new Dictionary<Enum4, int>();
private static readonly Dictionary<Enum5, int> map5 = new Dictionary<Enum5, int>();
 public static void func() { }
}

public static class Maps2
 {
 public enum Enum1 { i1, }
 public enum Enum2 { i1, }
 public enum Enum3 { i1, }
 public enum Enum4 { i1, }
 public enum Enum5 { i1, }
private static readonly Dictionary<Enum1, int> map1 = new Dictionary<Enum1, int>();
private static readonly Dictionary<Enum2, int> map2 = new Dictionary<Enum2, int>();
private static readonly Dictionary<Enum3, int> map3 = new Dictionary<Enum3, int>();
private static readonly Dictionary<Enum4, int> map4 = new Dictionary<Enum4, int>();
private static readonly Dictionary<Enum5, int> map5 = new Dictionary<Enum5, int>();
 public static void func() { }
}

public static class Maps3
 {
 public enum Enum1 { i1, }
 public enum Enum2 { i1, }
 public enum Enum3 { i1, }
 public enum Enum4 { i1, }
 public enum Enum5 { i1, }
private static readonly Dictionary<Enum1, int> map1 = new Dictionary<Enum1, int>();
private static readonly Dictionary<Enum2, int> map2 = new Dictionary<Enum2, int>();
private static readonly Dictionary<Enum3, int> map3 = new Dictionary<Enum3, int>();
private static readonly Dictionary<Enum4, int> map4 = new Dictionary<Enum4, int>();
private static readonly Dictionary<Enum5, int> map5 = new Dictionary<Enum5, int>();
 public static void func() { }
}

public static class Maps4
 {
 public enum Enum1 { i1, }
 public enum Enum2 { i1, }
 public enum Enum3 { i1, }
 public enum Enum4 { i1, }
 public enum Enum5 { i1, }
private static readonly Dictionary<Enum1, int> map1 = new Dictionary<Enum1, int>();
private static readonly Dictionary<Enum2, int> map2 = new Dictionary<Enum2, int>();
private static readonly Dictionary<Enum3, int> map3 = new Dictionary<Enum3, int>();
private static readonly Dictionary<Enum4, int> map4 = new Dictionary<Enum4, int>();
private static readonly Dictionary<Enum5, int> map5 = new Dictionary<Enum5, int>();
 public static void func() { }
}

public static class Maps5
 {
 public enum Enum1 |