静态与实例方法性能C#

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

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

public static string MethodName(parameters) { } 

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

  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指令实现,这会产生轻微的开销。 请注意,将方法更改为静态方法不太可能对雄心勃勃的性能目标有所帮助,但它可以帮助一点点,并可能导致进一步减少。

我有点困惑哪一个使用?

您的第一个链接指出:

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

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

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

添加此属性将导致CLR将lock(typeof(YourClass)) static方法和lock(this)实例方法包装起来。

应尽可能避免这种情况


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

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

我个人总是会选择更适合于完成当前任务并编写稳定,可读且易于维护的代码的方法。

还有其他方法可以提高应用程序的性能。

一些例子:

  • 如果你想多次使用一个简单的方法而不是每次实例化一个对象(一个辅助函数),那么在静态类中使用静态方法。

  • 如果您的方法访问类中的其他变量并且不是线程安全的,请使用s成员函数。

  • 在asp.net中,如果你想在会话中共享一个对象,或者你可以通过内部缓存结果的方法来提高性能,那么静态方法也可以。

  • 您可以混合两种方式并使用工厂设计模式来创建具有某些成员函数的类,但是您确保一次只有一个实例。

  • 有时静态函数可以避免愚蠢的错误或减少额外的运行时检查的需要:

     String.IsNullOrEmpty(thisstringisnull) // returns true thisstringisnull.IsNullOrEmpty() // If Microsoft would have implemented // the method this way you would get a // NullReferenceException 

但总体而言,这完全取决于当前的任务。 没有简单的“总是使用这种方法……”回答你的问题。

这基本上是一种设计选择。 如果您有包含创建类实例和更新某些属性的逻辑,请转到实例方法,因为静态方法将在实例之间共享。 虽然如果你有一些实用函数,比如做一些字符串操作,创建一个连接字符串等……不涉及对象操作,那就去静态方法。