Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 性能是使用单例类或静态类的充分理由吗?_.net_Performance_Oop_Static_Singleton - Fatal编程技术网

.net 性能是使用单例类或静态类的充分理由吗?

.net 性能是使用单例类或静态类的充分理由吗?,.net,performance,oop,static,singleton,.net,Performance,Oop,Static,Singleton,我有一个类,我认为它不应该是单例类或静态类。它有状态,尽管状态可以被消费者共享。当存在共享状态时,我喜欢远离单例,但我听到的论点是,在任何给定时间,只有一个对象实例存在,我将从中获得性能优势 在我的特殊情况下,与这个对象相关的数据并不多——两个字典(最多)每个都有150个条目,并且字典 在哪一点上——如果有的话——性能论证有任何价值 仅供参考-我正在使用.NET 谢谢 我不认为性能是一个非常有力的论据,无论是支持还是反对使用单例模式。这是一个设计问题,使用单例是否合理: 如果只需要对象的一个实例

我有一个类,我认为它不应该是单例类或静态类。它有状态,尽管状态可以被消费者共享。当存在共享状态时,我喜欢远离单例,但我听到的论点是,在任何给定时间,只有一个对象实例存在,我将从中获得性能优势

在我的特殊情况下,与这个对象相关的数据并不多——两个字典(最多)每个都有150个条目,并且字典

在哪一点上——如果有的话——性能论证有任何价值

仅供参考-我正在使用.NET


谢谢

我不认为性能是一个非常有力的论据,无论是支持还是反对使用单例模式。这是一个设计问题,使用单例是否合理:


如果只需要对象的一个实例,请使用单实例


如果需要多个实例,请不要使用。

否。性能参数没有任何优点

在假设您存在性能问题之前,您应该对其进行基准测试并确认/识别。10次中有9次不是你想的那样


如果需要一个单例,它就是。

单例模式的存在主要是为了允许您指定只需要一个类实例。静态类通常用于提供无状态行为。你所描述的似乎并不符合这两个类别。我将研究使用缓存而不是单例模式来提高代码的性能。当然,您的缓存可能是单例的,但对于缓存来说,这是有意义的


当然,如果您的对象是一个缓存,那么我只是把自己说成了一个圆圈。

出于性能原因,您不应该考虑创建一个单例(或静态类)


您要么需要通过设计使其成为一个单件,要么不需要。如果类的多个实例应该存在并且彼此不同,则不能使用单实例。

如果构建成本较高,则可能更适合使用返回公共实例的模式。单身汉的名声不好,特别是在TDD人群中,但实际上AF和单身汉可以做同样的事情(AF可以做更多,但情况不同)


既然成本不高,那就没关系了。

通常情况下,单例对性能的抑制比任何东西都大。这意味着您必须在多线程应用程序中以锁和同步方式包装该类。如果没有使用单态或全局,这可能是可以避免的

所以单身汉可能会慢一些,但我想不出哪种情况会更快

如果希望应用程序共享某个对象的单个实例,请传递对该对象的引用。这也让您可以灵活地在以后更改设计,因为出于缓存或并发原因,使用多个单独的实例实际上会更快


关于性能,最重要的一点是很难预测。不管你认为你的瓶颈是什么,你几乎肯定是错的。因此,确保良好性能的最佳方法是使修改程序变得容易。单身人士在那里对你不利。一旦你有一个单身汉,几乎不可能删除。您只能使用该类的一个通用实例,即使多个实例的性能会更好,即使局部变量而不是全局单例会提高缓存使用率。

您应该仅在概念上只有一个对象实例的情况下使用单例,不要人为地将开发人员限制为一个实例。如果可能有两个实例,那么它不应该是单例


如果是前者,并且存在与对象相关联的状态,那么如果与初始化相关联的成本很大,并且可能永远不会使用该类,或者延迟初始化的原因,那么单例是有用的。在这种情况下,单身是好的。另一种方法是使用静态类,当上述方法不适用时,您应该使用它。

LOL“当然,如果您的对象是缓存,那么我只是把自己说成了一个圆圈。”是的,闻起来像是过早的优化。但是几乎不需要单例。大多数支持单身的论点都没有任何价值(我能想到的唯一一种情况是,你绝对想强制执行“只有一个实例”事情发生在驱动程序开发和类似的领域,直接映射到硬件。好吧,吹毛求疵,如果你不需要遵循多个引用,单例可以更快,但事实上这不会影响任何事情。为什么会更快?因为你必须在每个方法调用中复制一个引用?我想,但我们基本上是在讨论一个关于一个周期,在今天的CPU上可能还没有。或者我还没有发现其他开销吗?传递引用是提供您所说的灵活性的一种丑陋的方式。您可以从静态CreateInstance方法中获得完全相同的灵活性。它或者返回一个单例(惰性初始化,如果您愿意的话),或以后您可以更改它以创建任意多的实例。是的,这是另一种选择。有很多方法可以避免单例,并允许在实现细节上具有灵活性。但无论您如何做,只要您远离单例,您可能做得不太差。:)这个论点提到了为什么在任何情况下单身汉都会更快吗?否则,以代码为基础似乎是一个很大的飞跃。免责声明-我不相信这个论点(因此这个问题),但是:1.)如果只有一个实例可以存在,那么内存占用会更小;2.)如果对象仅为