Performance-Sensitive Coding Rule

(1) 如果一个class里的method不需要调用实例数据(instance data)或者其他实例方法, 将其设计为static的。原因是这样会让编译器直接去emit非虚的call site,如此一来,可以防止在代码运行时每次call前都要去检查当前对象的指针是否为null。

(2)尽可能的避免抛出异常。异常对于GC的侵害是很严重的,异常发生时程序遇到一个break(就像街舞里的那种break一样)。很多书和blog里都讲.net对异常和自定义异常的完美支持,确实这样做另程序方便的构建的安全,使用exceptions来作为消息传递的也大有人在,但是这是损害性能的一大杀手。不仅要避免抛出异常,还要尽可能的避免去使用像Int32.Parse()这样潜在的会有导致异常的方法。

(3)对于需要使用Dispose的地方,在设计组件时,一定要防御式编程。一定要记得调用你代码的家伙很有可能不知道什么是Dispose或者丫会忘记调用它。使用析构函数来做清扫工作,虽然不知道什么时候才会被执行,但是至少该清理的资源早晚会被清理掉。

(4)Active.CreateInstance()以及其泛型方法的效率是不容易测试的,因为测试用例不一定适合你。为啥这么说?这个方法的效率与类的结构有很大的关系。

(5)if..else..这样的流程语句,尤其是复杂一点的,不用把所有的functional code都写到里面,应该各自封装成函数调用,这是加快程序启动的有效法宝.因为.net为了加速app的启动,在jit这里是按照方法来编译了,用到哪个方法就编译哪个方法为可执行代码.我们有很多的if..else..基本上都是80%的情况下执行某一个流程,另一个流程的频繁程度低,往往作为防御来构建的,尤其是在某个不常被执行的流程上需要复杂的操作,那么此时编译需要的消耗更加严重,因此此时最佳的做法就是多写方法. 其次, try..catch..和虚方法是个问题,他们不能被编译器用于inline操作. 其他的小方法可以在合适的时候被compiler做inline的操作.

『该文章是俺平时的心得体会,想到哪里就写到哪里,有时间就写,会随时更新』

posted @ 2009-01-23 00:08  new 维生素C.net()  阅读(252)  评论(0编辑  收藏  举报