3. 程序编码优化
程序编码优化中包括集合优化、字符串链接优化、类型转换优化、字符串类型向值类型转换、引用类型之间转换。
3.1 集合操作
在ASP.NET中.NET Framework提供了相当多的集合类,例如我们经常使用的ArrayList、BitArray、Hashtable、Queue、SortedList、Stack、ListDictionary、NameValueCollection、OrderedDictionary、StringCollection、List<T>及数组等,在相应的集合操作时,首先要熟知不同集合的特性,按照操作需求选择合适的集合。在所有的集合中,数组的性能是最高的,所以,当需要存储的数据其容量固定不变且数据类型一致时,尤其是数据没有值类型和object类型相互转换的操作时,数组的操作效率是极高的[5]。
在选择集合类型时应该考虑一下几点:
(1)该集合的长度是否固定,如果需要存储的数据其容量不变且类型一致,数组是个不错的选择。
(2)该集合中的元素类型是否一致,假如需要存储的数据其类型相同且都是int或者string类型,则可以优先考虑数组类型,因为数组类型可以避免值类型和object类型相互转换操作,从而提高效率。
(3)对集合主要存在哪些操作,如果对集合以查找为主,可以考虑一个散列或者字典<TKey,TValue>这样的集合,该集合相对于其他的集合比较的次数较少。
(4)如果该集合长度不固定,系统会默认一个数值来制定该集合的长度,当该集合被使用时超出了该长度,系统会在内部重新生成一个集合,再将原来的集合复制过来,这样就增大了系统的开销[6]。因此,在对即将存储大量数据的集合进行操作时,最好给其一个较大的初始值,以免增加额外扩充集合带来的系统性能损失。
使用相同数据测试数组、ArrayList以及List<T>集合操作结果如图1所示。
图1 测试数组、ArrayList以及List<T>集合操作结果
3.2 字符串连接优化
在.NET Framework 中值变量和string类型是两个完全不同的且比较特殊的类,前者存储时直接在栈中分配内存,而后者存储时是在堆中分配内存,“通用语言运行时”通过一种特殊的方法来存放字符串。“通用语言运行时”会产生一个名为“拘留池”的表,在该表中有已经声明的且不重复的字符串的单个实例。该拘留池节约字符串存储空间[7]。如果几个变量所分配的字符串是相同的,则每个变量不是引用相同字符串的不同实例,而是引用“拘留池”的同一个常数。String类型虽然是引用型变量,但其赋值方式却和值类型的赋值方式类似,例如string aa="abcd"。当值类型变量和引用型变量不再使用时都会被回收,但回收的方式却有所不同:值类型变量不需要垃圾回收器回收,而引用型变量在不再使用的情况下需要垃圾回收器回收。
在串赋值操作中:
string aa="123";
string bb="123";
和string aa="123";
string bb=a;
两种赋值方式结果是一样的,aa和bb都是指向堆中的同一个引用,即字符串"123"。在给串赋值时,“拘留池”会首先检查表中有没有和需要赋值相等的字符串,如果存在相等的字符串时,直接返回该字符串的引用,如果不存在相等的字符串时,“拘留池”中会添加一个新的字符串,返回该字符串的引用。如此看来,如果操作中需要多次链接字符串就有可能在每次链接字符串时添加新的字符串从而导致系统性能低下[8]。如果有一个专门用来检测“拘留池”是否存在该字符串的引用的方法,就可以避免这种情况导致的系统性能损失。这个方法就是IsInterned(string str)方法,如果存在引用,该方法直接返回该字符串的引用,否则返回null。 ASP.NET网站性能优化方法研究(3):http://www.youerw.com/jisuanji/lunwen_3686.html