现在的位置: 首页 > 综合 > 正文

Windows Mobile 进阶系列.第二回.初窥.NET CF类型加载器

2012年12月02日 ⁄ 综合 ⁄ 共 4860字 ⁄ 字号 评论关闭
相关文章
第零回.序和属性
第一回.真的了解.NET CF吗?

 

第二回.初窥CF类型加载器

摘要
对可执行的应用程序,它的生命是从Load开始的,一个.NET 的程序,某种程度上可以说它的生命是从加载类型开始的。本文阐述了在.NET CF中的Type Loader的工作原理,并结合示例说明了如何让您的应用程序启动更快。
Keywords
.NET Compact FrameworkType Loader JIT GenericDictionary

1.       设备不能承受之慢

等待是很痛苦的,让用户等待是不人道的。现在PC机上的程序也许感觉不是很明显,因为桌面计算机性能普遍较佳,而且一般的应用程序不会涉及海量数据的运算,日常的程序即使有性能上的某些缺陷,用户也不会明显的察觉到。

然而在CPU处理能力和内存均有限的移动设备上,计算机的工作能力就没有那么可观了。也许一个简单的程序就能让你的设备陷入肉眼就能识别的性能危机。设想一下用户怀着愉悦的心情在你的程序中选择了一个菜单项,但是他那台不怎么样的设备却需要反应数十秒,用户也只能望着屏幕中央不断旋转的光标兴叹了,这无疑对用户来说是一个打击,软件开发人员更是颜面无光。

好吧,下面我们就来看看下面一个简单的程序是如何折腾你的CLR的,虽然我刻意将它极端化了一点点J

   public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();

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

            
安置一些计时的环节,并调用funcX()触发Type Loader

            
//将结果保存到本地文本文件中
            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一致的其他五个方法
    }


    
/// <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一样的其他五个类

抱歉!评论已关闭.