.NET性能优化系列(一)
性能优化及其生存期类型
> 代码优化
> 连接池优化 DataReader
> ViewState 页面缓存 配置
> 优雅的结构 & 糟糕的性能
值类型和引用类型
> 值类型的存储空间是在堆栈上分配,而不是托管的堆上,因而生存期都比较短,且性能也高
> 引用类型的存储空间在托管的堆上划分空间,并且是由垃圾回收来释放
常见引用类型:
1.结构体和类:如果参数频繁作为参数,建议用类,因为结构体要频繁的做装箱和拆箱操作(Why?),并且不能继承
2.String和StringBuilder Compareto(),equals,== 三种运算符都是值比较。对string对象的操作后生成新对象,而Stringbuilder返回同一对象,若需要对对象作频繁处理,建议用StringBuilder
3.System.Collection命名空间
> Array ArrayList和SortedList区别。Array要求长度固定,元素类型相同,ArrayList长度则是可变,但也要求元素类型相同。而SortList不仅容量可变,元素类型也可以不同,并且元素是以键值对的形式存在的
> Stack栈
> Queue Hashtable
> CollectionBase强类型集合的抽象基类
了解GC机制
> 设计思想
寻找不再使用的对象,将它们从内存中删除,压实托管堆以释放不再使用的对象所占有的内存,然后对象的引用指向该对象新的存储位置
> 分代的垃圾回收器(Generational Garbage Collector):
0代:存储最近的分配对象,存储区域小(256K),存取速度比较快,容量填满后,进行一次垃圾回收,不再使用的部分放入终结队列,等待终结,还在使用的对象放入第1代;
1代:接收存放第0代的还在使用的对象,陆续接受0代传过来的对象,等填满之后,执行与0代一样的动作,即进行一次垃圾回收,不再使用的部分放入终结队列,等待终结,还在使用的对象放入第2代;
注:经过一轮垃圾回收后,不再被使用的对象被删除,保留的对象移入第1代
2代:重复一代的动作...
注:再经过新一轮的垃圾回收后,保留的对象被移入第2代,这一代包含了生存期较长的对象。这些对象至少经过了两轮回收
特点:当执行高级代的垃圾回收时,同时执行低级代的垃圾回收(??)
终结器 Finalize()
> 终结器需定义为受保护的方法,且必须在实现自己的代码前调用基类的终结器
> 每个类提供终结器,在类销毁时执行垃圾回收工作,不能人工干预,由CLR调用执行
> 析构器,DotNet编译器会自动生成与终结器等价的代码,一个类中只能存在析构器或终结器
> .Net框架在回收一个有终结器或析构器的对象时,并不直接从内存中删除,仅仅只是将该对象置入一个等待终结的对象的队列,然后由一个线程负责终结队列中每个对象执行终结器
> 终结操作的执行是不确定的,当某个对象执行终结器时,它引用的对象可能已经被终结了,因而,尽量避免使用终结器
Dispose() & Close()(主要用于文件和连接操作)
> 强烈推荐用手工Dispose(),阻止终结
System.GC类 静态方法
> 阻止对象终结的方法:GC.SuppressFinalize()
> 发起新一轮的垃圾回收: GC.Collect() 全面的垃圾回收
GC.Collect(0) 第0代的垃圾回收
> GC.GetTotalMemory(true);GC.GetGeneration(this):参数对象位于第几代
实现Idisposable 接口
public Class Employee:Idisposable
{
~Employee()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
GC.SuppressFinalize(this)// 终结处理
}
// 清除资源
}
// 逻辑处理 如 public static void tt() {...}
.
.
.
}
调用时:
using (Employee emp = new Employee())
{
Employee.tt();
} //此处自动调用Employee.Dispose() 方法

浙公网安备 33010602011771号