日期:2014-05-18  浏览次数:20408 次

调用静态方法和创建对象来调用方法的速度比较?
实现一:
public   class   A
{
      public   A(){};
      public   string   ReturnString(){   reutrn   "Test ";}  
}
实现二
public   class   B
{
      public   B(){};
      public   static   string   ReturnString(){   reutrn   "Test ";}  
}
//调用一
A   a   =   new   A();
a.ReturnString();

//调用二
B.ReturnString();
比比两者执行速度,为什么?

------解决方案--------------------
无论是静态方法还是实例方法都是通过类型方法表来查找,然后再去执行的,每次调用都会创建新的临时堆栈,只要调用代码相同,怎么可能有效率高低之分?
------解决方案--------------------
如果把对象实例化时间强加在调用方法之上有什么意义?

只要设置一个全局实例,那每次调用就不会有多出来的时间了.
------解决方案--------------------
没有必要,静态方法的使用不是因为考虑速度的...

------解决方案--------------------
在性能上,静态方法确实要比非静态方法快一些,但不明显,并且我们使用静态方法的原因也不是因为它快.我个人认为静态方法与实例方法的使用只是为了区分语义.因为有些操作是与类相关而不是与这个类的实例相关的,此时可以考虑使用静态方法.比如一个会员类可以有一个公共静态的Delete(int ID)方法,这个方法用于删除任一指定的会员,但这个会员类的实例却不应该提供这样的方法.

关于静态方法与非静态方法的性能:CLR通常在编译我们的代码时会对我们的代码进行安全检查并生成一些额外的代码.在调用静态方法时,CLR在找到类型后可以直接调用.但在调用非静态方法时,CLR先要判断该实例是否为NULL,如果为NULL则会引发异常,如果不为NULL,则根据实例推导出实例的类型,最后实现调用.也就是调用所经过的步骤数量是不一样,从而造成非静态方法要比静态方法慢,但这种差异在运行时应该是很细微的.