我有一个我认为不应该是单例或静态类的类。它具有状态,尽管状态可以由消费者共享。当存在共享状态时,我喜欢远离单例,但我听到的论点是,我将从在任何给定时间只存在一个对象实例中获得性能优势。
在我的特定情况下,与此对象相关联的数据并不多——两个字典(最多)每个字典中有 150 个条目。
性能论点在什么时候——如果有的话——有任何价值吗?
仅供参考 - 我正在使用 .NET。
谢谢!
我有一个我认为不应该是单例或静态类的类。它具有状态,尽管状态可以由消费者共享。当存在共享状态时,我喜欢远离单例,但我听到的论点是,我将从在任何给定时间只存在一个对象实例中获得性能优势。
在我的特定情况下,与此对象相关联的数据并不多——两个字典(最多)每个字典中有 150 个条目。
性能论点在什么时候——如果有的话——有任何价值吗?
仅供参考 - 我正在使用 .NET。
谢谢!
不,性能论点没有任何价值。
在假设您有性能问题之前,您应该进行基准测试并确认/识别性能问题。10 次中有 9 次不是你想的那样。
如果需要一个单例,它就是。
单例模式的存在主要是为了让您指定您只需要一个类的实例。静态类通常用于提供无状态行为。你所描述的似乎并不真正适合任何一个类别。我会研究使用缓存而不是单例模式来提高代码的性能。当然,你的缓存可能是一个单例,但在缓存的情况下它是有意义的。
当然,如果您的对象是缓存,那么我只是把自己说成一个圈子。
出于性能原因,您不应该考虑创建单例(或静态类)。
您要么需要通过设计使其成为 Singleton ,要么不需要。如果你的类的多个实例应该存在并且彼此不同,那么你不能使用单例。
我不认为性能是一个非常有力的论据,无论是支持还是反对使用单例模式。这是一个设计问题,使用单例是否有意义:
如果您只需要一个对象实例,请使用单例。
如果您需要多个实例,请不要。
您应该仅在概念上只能存在一个对象实例的情况下使用 Singleton,而不是人为地将开发人员限制为一个实例。如果可能有两个实例,那么它不应该是单例。
如果是前者,并且存在与对象关联的状态,那么如果与初始化相关联的成本很高,并且有可能永远不会使用该类,或者有延迟初始化的原因,那么单例是有用的。在这种情况下,单例是好的。另一种方法是使用静态类,只要上述不适用,您就应该使用它。
如果构建成本很高,那么您可能更适合返回公共实例的抽象工厂模式。Singleton 的名声不好,特别是在 TDD 人群中,但实际上 AF 和 Singleton 可以做同样的事情(AF 可以做的更多,但那是另一回事)。
既然你没有很大的成本,那么它可能并不重要。
通常,单例会抑制性能,比什么都重要。这意味着您必须在多线程应用程序中将类包装在锁和同步中。如果没有使用单例或全局变量,这可能是可以避免的。
所以单例可能会更慢,但我想不出任何情况下它会更快。
如果您希望您的应用程序共享一个对象的单个实例,则传递对该对象的引用。这也使您可以灵活地在以后更改设计,因为事实证明,出于缓存或并发原因,使用多个单独的实例实际上会更快。
关于性能,要记住的最重要的一点是它很难预测。不管你猜你的瓶颈是什么,你几乎肯定是错的。因此,确保良好性能的最佳方法是让您的程序易于修改。单身人士在那里对你不利。一旦你有了一个单例,就几乎不可能删除。即使多个实例的性能会更好,即使局部变量而不是全局单例会提高缓存的使用率,您也会被该类的一个通用实例所困扰。