Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.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
C# ASP.NET核心单实例与瞬态实例性能_C#_Asp.net_Asp.net Core_Dependency Injection_.net Core - Fatal编程技术网

C# ASP.NET核心单实例与瞬态实例性能

C# ASP.NET核心单实例与瞬态实例性能,c#,asp.net,asp.net-core,dependency-injection,.net-core,C#,Asp.net,Asp.net Core,Dependency Injection,.net Core,在ASP.NET核心依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能 在我看来,对于Singleton实例,创建新对象和依赖对象只需花费一次时间。对于瞬态实例,将为每个服务请求重复此成本。因此,Singleton似乎更好。但是当使用单例而不是瞬态时,我们的性能提高了多少?提前谢谢你 就像回复中提到的,这实际上不是性能问题 有关更多详细信息,请参见下面的链接,其中详细解释了差异。 这对性能有影响的唯一方法是如果你的构造函数做了很多事情。这是可以而

在ASP.NET核心依赖注入中,我只是想知道注册
Singleton
实例是否会比注册
Transient
实例更好地提高性能


在我看来,对于
Singleton
实例,创建新对象和依赖对象只需花费一次时间。对于
瞬态
实例,将为每个服务请求重复此成本。因此,
Singleton
似乎更好。但是当使用
单例
而不是
瞬态
时,我们的性能提高了多少?提前谢谢你

就像回复中提到的,这实际上不是性能问题

有关更多详细信息,请参见下面的链接,其中详细解释了差异。


这对性能有影响的唯一方法是如果你的构造函数做了很多事情。这是可以而且应该避免的,尽管在所有情况下都是如此。

正如其他人所说,性能不是你应该在这里做出决定的因素:无论哪种方式,性能都不会受到显著影响。您应该考虑的是依赖关系,包括托管和非托管。当您使用有限的资源(如套接字和连接)时,单例是最好的。如果每次注入服务时都必须创建一个新的套接字(暂时),那么套接字很快就会用完,性能就会受到影响

当资源使用是临时的且影响最小时,临时范围更好。例如,如果您只是在进行计算,那么这可能是暂时的,因为您不会因为拥有多个副本而耗尽任何资源

当状态重要时,您还希望使用单例作用域。如果某个操作需要持续执行一个特定的操作,那么transient将不起作用,因为您将没有状态,因为它基本上会在每次注入时重新开始。例如,如果您试图协调一个并发队列,使用信号量作为锁,那么您肯定需要一个单例范围的服务。如果状态不重要,那么瞬态可能是更好的范围

最后,您必须查看您的服务依赖的其他服务。如果您需要访问限定范围的服务(例如请求限定范围的服务),那么单例是不合适的。虽然您可以使用服务定位器模式来访问作用域服务,但这是一种失礼,不推荐这样做。基本上,如果您的服务使用除其他单例服务以外的任何服务,那么它很可能是限定范围的或暂时的

长和短,使用一个临时范围,除非你有一个好的,明确的理由使它成为一个单例。这就是上面提到的原因:维护状态,有效地利用有限的资源,等等。如果服务将在一个临时范围内工作,并且没有很好的理由不这样做,那么使用临时范围


现在,ASP.NET核心的DI既有“暂时”的生命周期,也有“范围”的生命周期。这两个都是“暂时的”,因为它们来了又走,但是“作用域”在每个“作用域”(通常是一个请求)实例化一次,而“暂时的”总是在每次注入时实例化。在这里,您应该使用“scoped”,除非您有明确的理由使用“transient”。

我认为这不是更好或更坏的情况,是的,是正确的情况,这在很大程度上取决于谈论依赖注入时这不是性能问题。您应该使用您需要的解决方案。我同意@Silvermind的观点,但是,在不影响可观察行为的情况下,您可能更喜欢使用
Singleton
,而不是
Transient
,以减少对象构造和图形遍历的开销。然而,像所有的优化一样,您应该衡量一下这是否重要。@JoãoPauloAmorim,谢谢您的回答。在我的例子中,单用或瞬态都可以使用,所以我考虑选择更好的性能。Singleton可能会导致内存泄漏,但我认为它的性能更好。@Silvermind,谢谢。您是否衡量了他们的表现,或者是否有任何链接参考此?感谢您的回复。在我的例子中,我考虑使用SuntLon在瞬态时的性能和泄漏内存。当然,这两种方法都可以应用到我的案例中。正如前面提到的,在这里的其他评论中,这不仅仅取决于性能。应用程序中的性能增益或差异在很大程度上取决于应用程序的进一步上下文。真正验证这一点的唯一方法是实际运行您的场景并对其进行测试,即使如此,,,,,可能还有很多其他的东西可以给您带来更显著的性能改进。+1供您解释。然而,我有点混淆了关于transient vs scoped per transaction的最后一条语句。Microsoft声明“每次从服务容器请求临时生存期服务时,都会创建临时生存期服务。此生存期最适用于轻量级、无状态服务。”这意味着对于REST api,建议使用临时服务?它指的是您注入的服务,而不是整个api中的“服务”。我的观点是,你应该经常使用
AddScoped
,除非你有一个特定的用例,可以使用其他方法,如
AddSingleton
AddTransient
来注册你的服务。答案很好!但请允许我注意,有一类服务的简单规则“如果不存在其他原因,则范围最好”可能会误导您。对于.NETCore自己的服务来说尤其如此。例如,您可能会认为AddScope非常适合HttpContextAccessor服务。但事实并非如此。您应该使用
services.AddSingleton()在这种情况下。底线:检查文档(或StackOverflow)以了解您自己没有编写的任何服务的正确生存期!在我的例子中,使用transient i