静态与实例方法性能C#

时间:2010-06-10 17:11:02

标签: c# .net performance static-methods

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

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

public static string MethodName(parameters) { }

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

  1. 哪一个更好?静态方法还是非静态方法?
  2. 为什么它更好?
  3. 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指令,强加了一个   轻微的开销。请注意,将方法更改为静态   方法不太可能对雄心勃勃的绩效目标有所帮助,但是   它可以帮助一点点,并可能导致进一步减少。

    我很困惑使用哪一个?

4 个答案:

答案 0 :(得分:43)

您的第一个链接指出:

  

这是因为静态方法正在使用   锁是线程安全的。永远这样做   内部有一个Monitor.Enter()和   Monitor.exit()确保线程安全

这完全可怕,令人憎恶错误。


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

添加此属性将导致CLR在static中包含lock(typeof(YourClass))个方法,在lock(this)内包含实例方法。

This should be avoided where possible


你的第二个链接是正确的。
Static methods are a little bit faster than instance methods,因为它们没有this参数(因此从callvirt指令中跳过NullReferenceException检查)

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

一些例子:

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

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

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

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

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

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

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

答案 3 :(得分:0)

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