静态与实例方法性能C#

dot*_*uts 19 .net c# performance static-methods

我在ASP.NET Web应用程序中的公共类中声明了很少的全局方法.

我习惯以下列格式在公共类中声明所有全局方法

public static string MethodName(parameters) { }
Run Code Online (Sandbox Code Playgroud)

我想知道它会如何影响性能观点?

  1. 哪一个更好?静态方法还是非静态方法?
  2. 为什么它更好?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244指出:

因为,静态方法使用锁是线程安全的.始终在内部执行Monitor.Enter()和Monitor.exit()以确保线程安全.

虽然http://dotnetperls.com/static-method声明:

静态方法在调用堆栈上调用通常比实例方法更快.在C#编程语言中有几个原因.实例方法实际上使用'this'实例指针作为第一个参数,因此实例方法将始终具有该开销.实例方法也使用中间语言的callvirt指令实现,这会产生轻微的开销.请注意,将方法更改为静态方法不太可能对雄心勃勃的性能目标有所帮助,但它可以帮助一点点,并可能导致进一步减少.

我很困惑哪一个使用?

SLa*_*aks 43

您的第一个链接指出:

这是因为静态方法使用锁是线程安全的.始终在内部执行Monitor.Enter()和Monitor.exit()以确保线程安全

这完全是可怕的,可恶的错误.


如果添加[MethodImpl(MethodImplOptions.Synchronized)]到方法,则该语句将变为部分为真.

添加此属性将导致CLR将static方法内部lock(typeof(YourClass))和实例方法包装在其中lock(this).

应尽可能避免这种情况


你的第二个链接是正确的.
静态方法比实例方法快一点,因为它们没有this参数(因此跳过了NullReferenceExceptioncallvirt指令的检查)


Cha*_*ion 5

在这方面,我倾向于很少关注表现.哪些静态方法对于实施功能实践非常有用.例如,如果在实例类中创建私有静态帮助器方法,则可以知道该方法无法修改实例的状态.