我的问题是有关的静态方法VS实例方法和他们的可扩展性的性能特点。 假定对于这种情况,所有的类定义是在一个单一的组件和所需的多个离散指针类型。
考虑:
public sealed class InstanceClass
{
public int DoOperation1(string input)
{
// Some operation.
}
public int DoOperation2(string input)
{
// Some operation.
}
// … more instance methods.
}
public static class StaticClass
{
public static int DoOperation1(string input)
{
// Some operation.
}
public static int DoOperation2(string input)
{
// Some operation.
}
// … more static methods.
}
上述类代表一个帮手风格的图案。
在一个实例类,解决实例方法花点时间来做为反对StaticClass。
我的问题是:
当保持状态不是(不需要字段或属性)一个问题,就是它总是最好使用一个静态类?
哪里有相当数量的这些静态类定义(说100例如,与许多各静态方法),这会不会影响执行性能或内存消耗负与相同数量的实例类的定义相比?
当同一个实例类中的另一个方法被调用,并实例分辨率仍时有发生? 例如使用[此]关键字等this.DoOperation2("abc")
从内部DoOperation1
同一实例的。
从理论上讲,一个静态方法应该执行不是一个实例方法稍微好一点,其他所有的事情都是因为隐藏多余的平等, this
参数。
在实践中,这使得这么少的区别,它会隐藏在各种编译器决定的噪音。 (因此,两个人可以“证明”比另一个更好地与不同意的结果)。 不能,因为至少this
在寄存器通常通过,往往是在注册开始。
最后这一点意味着,在理论上,我们应该期待的是需要一个对象作为参数,并做一些事情与它要稍微比等效为同一对象的实例那么好的一个静态方法。 再次,虽然,所不同的是如此之小,如果你试图测量它你可能最终测量其他一些编译器的决定。 (特别是自的可能性,如果该参考在寄存器是所述整个时间是相当高的太)。
真正的性能差异将下降到是否你已经得到了人为对象在内存中做一些事情,自然应该是静态的,或者你纠缠了对象传递以复杂的方式做什么自然应该实例链。
因此,对于数字1,当保持状态不是一个问题,它总是最好是静态的, 因为这是静态的是 。 这不是一个性能问题,虽然有与最佳化编译器很好地发挥整体的规则 - 它更可能是有人去优化该拿出比那些拿出奇怪利用正常使用情况下的努力。
2号。没什么区别。 还有每个部件的两端有多少元数据,多少代码没有在实际的DLL或EXE文件,以及有多少即时编译的代码就会有这方面一定量每级的成本。 这是相同的无论是实例或静态。
随着第3项, this
是因为this
确实。 但是请注意:
在this
参数是在一个特定的寄存器传递。 当调用同一个类中的实例方法,它很可能会成为该寄存器已经(除非它被藏匿和使用某种原因寄存器),因此没有设置必要的行动this
给它需要设置什么至。 这适用于在一定程度上,例如前两个参数的方法是它使一个呼叫的前两个参数。
因为它会很清楚, this
是不为空,这可以用于优化在某些情况下调用。
因为它会很清楚, this
是不为空,这可能使联的方法调用更有效的再次作为生产假冒的方法调用的代码可以省略一些空的检查可能需要无妨。
这就是说,null检查很便宜!
值得一提的是,作用在物体上,而不是实例方法一般静态方法,可以减少一些在讨论的成本http://joeduffyblog.com/2011/10/23/on-generics-and-some-of-在相关的塔顶/在该给定的静态不叫对于给定类型的情况。 正如他所说的那样“顺便说一句,事实证明,扩展方法是使通用更加抽象一个伟大的方式付费的发挥。”
但是,请注意,这仅涉及通过该方法使用其它类型的,不存在的,否则的实例。 因此,它真的并不适用于很多的情况下(其他一些实例方法使用的类型,一些其他的代码在其他地方使用的类型)。
摘要:
- 大多情况下的性能成本VS静态低于可忽略不计。
- 哪些费用有一般会在那里你滥用静态比如,反之亦然。 如果你不让它静态和实例之间的决定的一部分,你更有可能得到正确的结果。
- 在有些情况下被创建在更少种类的另一种结果的静态泛型方法罕见的情况下,比如通用方法,即可以把它有时有小利把很少使用(和“很少”是指哪些类型的它与在使用应用寿命,没有多久它叫)。 一旦你得到了什么他在那篇文章中谈论你会看到,它是100%无关大多数静态-VS实例决策反正。 编辑:而且大多只具有NGEN是成本,而不是与实时编译的代码。
编辑:对空支票是多么便宜的说明(我在上面声称)。 在.NET中最空的检查不检查空可言,而他们继续他们打算与假设,它会努力做的,如果访问发生异常时它就会变成一个NullReferenceException
。 因此,大多在概念上的C#代码涉及到一个空检查,因为它是访问一个实例成员,如果成功的成本实际上是零。 一个例外是一些内置调用,(因为他们要表现得好像他们所谓的一个实例成员),他们只投中一外地来触发相同的行为,所以他们也很便宜,他们仍然可以经常反正冷落(例如,如果在该方法的第一步涉及访问字段,因为它是)。
当保持状态不是(不需要字段或属性)一个问题,就是它总是最好使用一个静态类?
我会说,是的。 由于声明的东西static
声明无国籍执行的意图 (它不是强制性的,但一些人会期望的意图)
哪里有相当数量的这些静态类(说100例如,与许多各静态方法),这会不会影响执行性能或内存消耗负与相同数量的实例类的相比?
不要这么认为,除非你确定静态类是真正 stetless,因为如果没有它很容易陷入困境的内存分配,让内存泄漏。
当[此]关键字用于调用相同的实例类内的另一种方法,不实例分辨率仍然发生?
不知道, 这点(这是CLR的一个纯粹的实现细节),但想是的。
静态方法是快,但不能OOP,如果你会使用设计模式的静态方法容易坏的代码,编写业务逻辑,而不象文件读取静态的,常用的功能更好,WebRequest的等更好地实现为静态的......你的问题有没有普遍性回答