Welcome

首页 / 软件开发 / C# / C#代码优化方法

C#代码优化方法2007-11-10 本站 在编写基于.NET架构的应用程序,尤其是分布式时,我们常常极为关注应用程序的执行效率。如果掌握了如何编写高效率的代码,就能大幅度地提高应用程序的执行速度,并有助于减少应用程序的瓶颈(bottlenecks)。

18.4.1 撤消

我们知道,类object是.NET架构中的其它一个类的基类。类object是在System中定义的,它并没有声明析构函数,而是定义了一个保护类型的成员方法Finalize。

如果.NET的运行时垃圾收集器认为一个对象可以安全从内存中移出时,垃圾收集器就调用该对象的撤消方法Finalize,把对象移出内存,释放占用的系统资源。我们应该把对一些重要性能的考虑牢记在脑海里。

如果你有C++的开发背景,你也许会倾向于采用对象的析构函数来撤消对象。不过当你在.NET环境下编程,你就不能再试图依靠析构函数来执行对象的撤消。

对象的撤消方法Finalize会对程序的性能产生下列不良影响:

自己拥有撤消方法的对象在释放资源时将耗费更长的时间。

垃圾收集器并不按照一定的顺序来撤消对象,也并不保证每一个对象的撤消方法都能被正确的调用。

如果本应该撤消的对象引用了另一个暂时还不能撤消的对象,这个对象也不能撤消。

如果同时有大量的对象在等待撤消,这将会极为耗费系统资源,并降低系统性能。

每个需要清除的对象都必须执行撤消。为了优化性能,在必须使用Finalize方法时,你可以重载一个Close方法,当你需要清除某个对象时,你就可以调用Close方法,从而强迫垃圾收集器调用撤消方法,把该对象设为null。调用GC.SupressFinalize()方法(GC是System中提供的一个类),可以为你的代码中的元数据设置一个标记,告诉运行时GC不要撤消这个类。这样,你就可以在对象已没有用处时立即动手释放它。

下面的代码展示了如何设计一个重载Close方法的类:

public class MyClass{public override void close(){ GC.SupressFinalize(this)}protected override void Finalize(){ Close();}}
18.4.2 事务

当可操控的代码必须要和示操控的代码进行交互时,事务(transition)就发生了。这通常出现在当你需要平台调用服务(Platform Invocation Services,PInvoke)来访问未操控的动态链接库的静态指针入口,或者是访问COM提供的其它方法时。

每一次事务都会带来少量的开销,据估计每调用一次事务大约要执行10到40条指令。因此,最好的编程习惯是在代码中尽量少调用事务。如果情况必须,那就谨慎地使用事务。在使用API函数时,应尽可能地每次执行多个动作,而不是重复调用,但每次只执行少量动作。