泛型(五)代码爆炸

含义:在使用泛型类型参数的方法在进行JIT编译时,CLR获取方法的IL,用指定的类型实参进行替换,然后创建恰当的本地代码,这是泛型的主要特性之一。
 
然而有一个缺点,CLR要为每种不同的方法/类型组合生成本地代码,我们将这种现象称之为代码爆炸(code explosion),它会使应用程序的工作集显著增大,从而损害性能。
 
当然CLR不会坐视不管的,会提供一系列的优化措施,能够缓解代码爆炸
 
1.首先,假如为一个特定的类型实参调用了一个方法,以后再次使用相同类型实参来调用这个方法,CLR只会为这个方法/类型组合编译一次代码。所以,如果一个程序集使用List<DateTime>,一个完全不同的程序集(加载
 
到同一个AppDomain中)也使用List<DateTime>,CLR只会为List<DateTime>编译一次方法。
 
2.CLR认为所有引用类型实参都是完全相同的,所以代码能够共享。例如,CLR为List<String>的方法编译的代码可以直接用于List<Stream>的方法,因为String和Stream都是引用类型,CLR之所以能执行这个优化,是因为
 
所有引用类型的实参或变量实际只是指向堆上的对象的指针,而对象指针全部是以相同的方式来操纵。
 
但是某个类型的实参是值类型,CLR就必须专门为那个值类型生成本地代码。
posted @ 2012-11-26 10:32  Lordbaby  阅读(528)  评论(0编辑  收藏  举报