C# 在什么情况下,静态方法可以提高性能?

C# 在什么情况下,静态方法可以提高性能?,c#,.net,performance,calling-convention,C#,.net,Performance,Calling Convention,什么时候,如果有的话,将参数作为参数传递给静态方法比让该方法是非静态的并通过实例成员访问相同的值更快。假设该方法以只读方式访问这些成员 在所有其他条件相同的情况下,调用静态方法比调用实例方法更有效 在其他条件相同的情况下,调用不带参数的方法比调用带参数的方法要快一些 考虑: private Thing _thing; void DoTheThing() { _thing.DoIt(); } 与此等效代码相比: private Thing _thing; // caller's re

什么时候,如果有的话,将参数作为参数传递给静态方法比让该方法是非静态的并通过实例成员访问相同的值更快。假设该方法以只读方式访问这些成员

在所有其他条件相同的情况下,调用静态方法比调用实例方法更有效

在其他条件相同的情况下,调用不带参数的方法比调用带参数的方法要快一些

考虑:

private Thing _thing;

void DoTheThing()
{
    _thing.DoIt();
}
与此等效代码相比:

private Thing _thing;

// caller's responsibility to pass "_thing"
static void DoTheThing(Thing thing)
{
    thing.DoIt();
}
我想不出在现实世界中,这种优化真的会增加任何价值,但作为一种思维实验(对于那些喜欢讨论这类事情的人来说),真的有好处吗?如果有,那么有多少论点(什么类型的等等)会反过来打破平衡

还有其他因素会考虑到这一点吗?例如,静态方法将
\u thing
作为局部变量而不是字段进行访问。

对于非虚拟方法,我可以想到一个可能的性能优势:静态方法不需要首先测试引用是否为空(在适当的情况下抛出
NullReferenceException

我认为这目前没有任何优势,但这是可能的。但是,我不确定它是否适用于您的特定示例,而且很难看到它在您实际想要使用该值的任何情况下如何适用。

在您的情况下(我假设代码示例将在Thing类中),静态和非静态将完全没有速度差异。这是您的链接:

  • 0.2 0.2内联静态调用
  • 0.2 0.2内联此inst调用
因此,为了提速而使其静止是毫无意义的


还要考虑到链接页面中提供的值来自.Net 1.1,已经过时。

我不确定静态方法和实例方法中的性能静态


但我认为,应该决定是将其作为静态方法还是基于对象设计的实例方法。如果通过调用方法,对象的状态没有改变,那么应该将该方法设置为静态方法(类型的方法,而不是类型的特定实例的方法)

+1个好问题。在VS中对代码运行代码分析时,如果类中的方法可以标记为静态,则会出现错误CA1822。它总是让我感到厌烦,我真的想知道它是否有任何好处。@BFree——如果你遵循我在问题中包含的链接,你会发现调用静态方法的速度会稍微快一点。在IL中,调用方不必将对目标的引用推送到堆栈上(JIT可能会取消此操作),EE也不必检查此目标的可空性。是的,这会提高性能,但在循环中调用该方法数十万次之前,您不太可能看到它。过早优化。如果使方法静态与否的首要考虑因素是它在概念上是否属于对象类型,而不是对象的实例,那么它会提高我的理解能力。例如,如果对象狗有一个静态的Bark()方法。“我要找一个带解释的评论。”达伦——同意。对于那些发现语言/EE/JIT/type系统的内部工作方式很有趣的人来说,我问这个问题更多的是一个下午(无论如何,对我来说)的思维实验。我使用的示例可能是内联的,但较大的方法(或那些以值类型作为参数的方法,IIRC)不会内联,在这种情况下,静态调用的成本为6.1ns,实例调用的成本为6.8ns。根据链接,静态调用的实例调用为6.2ns,而不是6.1ns。此外,也没有数字,事实上我会假设这会被额外的参数过度补偿,这意味着静态版本可能会稍微慢一点。只是澄清一下:这是一个this实例调用@Drew-函数,其值类型作为参数从.NET 3.5 SP1开始正确内联。@Foxfire-如果我错了,请纠正我,但我认为实例方法有一个隐式的
这个
引用作为参数传递给它,在静态方法中它是显式的,但它们都有一个参数。我想这可能是一个实例调用。感谢您指出这一区别是一个因素。