ASP.NET Core Singleton实例与瞬态实例的性能

tuq*_*tuq 5 c# asp.net dependency-injection .net-core asp.net-core

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

Singleton例如,以我的想法,创建新对象和相关对象只需花费一次时间。对于Transient例如,该成本将重复每个服务请求。所以Singleton似乎更好。但是使用Singletonover 时我们可以获得多少性能提升Transient?谢谢高级!

Chr*_*att 13

就像其他人所说的那样,性能不应该在这里做出决定:无论哪种方式,性能都不会受到重大影响。您应该考虑的是托管和非托管的依赖项。当您利用有限的资源(例如套接字和连接)时,单例是最好的。如果最终每次注入服务(临时)都不得不创建一个新的套接字,那么您将很快用光套接字,那么性能确实会受到影响。

当资源使用是临时的并且影响最小时,临时范围会更好。例如,如果您仅在进行计算,则可以进行临时作用域分析,因为您不会因为拥有多个副本而耗尽任何资源。

当状态很重要时,您还想使用单例作用域。如果某件事需要经过一项特定的操作之后才能持续,那么瞬态将不起作用,因为您将没有状态,因为它基本上会在每次注入时都开始。例如,如果您尝试使用信号量锁定来协调并发队列,那么您肯定需要单例作用域服务。如果状态无关紧要,则瞬态可能是更好的范围。

最后,您必须查看您的服务所依赖的其他服务。如果您需要访问作用域服务(例如请求范围内的服务),那么单例是不合适的。尽管您可以使用服务定位器模式来访问作用域服务,但这是虚假的,不建议这样做。基本上,如果您的服务使用除其他单例服务以外的任何其他服务,则应该将其设置为作用域或临时的。

总之,除非有充分明确的理由使它成为单例,否则请使用过渡范围。这就是上面提到的原因:维护状态,有效地利用有限的资源等。如果服务将在过渡范围内工作,并且没有充分的理由这样做,则使用过渡范围。

现在,ASP.NET Core的DI具有“瞬态”和“作用域”寿命。从它们来回的意义上讲,这两个都是“瞬态的”,但是每个“作用域”(通常是一个请求)实例化“ scoped”一次,而每次注入时总是实例化“ transient” 。在此,除非有充分明确的理由使用“瞬态”,否则应使用“作用域”。

  • 很好的答案!但请注意,有一类服务的简单规则“如果不存在其他原因,范围是最好的”可能会误导您。对于 .NET Core 自己的服务尤其如此。例如,您可能认为 AddScoped 非常适合 HttpContextAccessor 服务。但事实并非如此。在这种情况下,您应该使用“services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();”。底线:检查文档(或 StackOverflow),了解不是您自己编写的任何服务的正确生命周期! (2认同)

ihe*_*heb 5

我知道这里的性能不是您应该寻找的,但出于好奇,我使用 BenchmarkDotNet 制作了一个示例基准应用程序来评估 AddSingleton 和 AddTransient 之间的差异

我使用的解决方案可以在这里找到(随意改进):https://github.com/iheb719/BenchmarkDifferentServicesInstances

这是我的总结:

我的笔记本电脑规格: BenchmarkDotNet=v0.13.1,操作系统=Windows 10.0.19042.1415(20H2/2020年10月更新)Intel Core i7-9750H CPU 2.60GHz,1个CPU,12个逻辑和6个物理核心.NET SDK=6.0.101 [主机]: .NET 6.0.1 (6.0.121.56705)、X64 RyuJIT 默认作业:.NET 6.0.1 (6.0.121.56705)、X64 RyuJIT

我的结果

方法 意思是 错误 标准差
调用单例应用程序 101.0 我们 0.64我们 0.53我们
呼叫瞬态应用程序 108.3 我们 1.16我们 1.03 我们

所以 AddSingleton 和 AddTransient 之间确实没有显着差异(当然,如果你的构造函数中没有大量的处理)


小智 1

正如回复中提到的,这实际上并不是性能问题。

有关更多详细信息,请参阅下面的链接,其中非常详细地解释了差异。 AddTransient、AddScoped 和 AddSingleton 服务差异

唯一影响性能的方法是你的构造函数正在做很多事情。但在所有情况下都可以而且应该避免这种情况。