Han*_*ant 86
通常是的,没有必要传递"this"引用.该引用在ECX寄存器中传递,因此不需要额外的堆栈空间.如果您从同一类的实例方法进行调用,则已设置该寄存器,根本不会有任何节省.但是当方法在另一个类中时,它可以帮助缓解x86 CPU核心的压力,x86没有很多寄存器.看到可测量的性能改善将非常罕见.
我虔诚地将不使用实例成员的类的方法标记为静态.我重视static关键字提供的固有契约:"此方法不会改变对象状态."
LBu*_*kin 54
如果方法不需要来自类所属的任何状态信息,则应该使方法成为静态方法.
如果你不关心多态,你可以通过决定是否接受类实例成员并将它们作为参数传递给方法来将任何方法写为实例或静态.您应该考虑的是,语法是否自然,代码是否易于理解和有意义,等等.
您可能不应该担心在此级别进行优化,因为实例与静态方法的性能开销可以忽略不计.是的,在调度表中使用了一些类型的空间(如果方法是虚拟的) - 但它是一个微小的,恒定的开销.是的,调用实例方法与静态方法的开销也很小 - 但同样很小.
这似乎是微观优化的一个层次,除非你有可衡量的,有形的证据表明相信实际上影响了程序的性能,否则你应该避免.事实上,如果你做的事情错了,传入其他参数的成本(将它们复制到堆栈等),而不是通过隐藏的访问它们this的类型的引用,可能会导致糟糕的性能.
您最好分析方法的语义,并在此基础上进行静态/实例决策.
如果你打算传递实例(SomeStaticMethod(obj, "abc", 123);),那么不是真的.您只能在没有多态性的场景中有用地使用静态方法,在这种情况下,很可能无论如何都会内联任何类似属性的简单事物.
使用对象"自然"( obj.SomeMethod("abc",123);)-保持代码的简洁,并且轮廓找出性能问题-这是非常不可能的实例和静态之间的区别,除非你正在运行一些非常紧密的循环.这里有一些场景中它可能无所谓,但他们很专业.