ASP.NET Core 中的依赖注入是否会增加性能开销?
Does dependency injection in ASP.NET Core add performance overhead?
我正在开发一个应用程序,其中避免了 DI 以提高性能。服务依赖性作为静态 class 实现,并在调用 class 中直接引用。这给测试带来了典型的挑战,因为不可能为此服务注入存根。
我的第一个想法是设置一个常规的 class 和接口,将其作为单例放入容器中,然后将其注入到调用 class 的构造函数中。此 API 应用对性能非常关键,因此设计选择不能增加任何额外的响应时间。
是否可以在不增加性能开销的情况下使用 DI?如果没有,是否有另一种设计模式可以用来保持性能,同时提高 class 的可测试性?
我 运行 一个简单的测试来验证这一点,发现使用来自 DI 的单例服务不会增加任何显着的性能开销。
我创建了一个带有接口的简单服务并将其注册到服务集合中。我创建了 2 个控制器。在一个中,我使用 new Service() 来获取实例,在另一个中,我通过构造函数注入了它。
我在发布构建模式下启动了该应用程序,并 运行 使用 K6 在每个控制器上进行了负载测试。使用 new Service() 的控制器平均耗时 184.94 微秒,使用注入的控制器平均耗时 186.07 微秒。
所以使用 DI 确实增加了轻微的(百万分之一秒)开销。这可能小到在使用 API.
时不会被注意到
我正在开发一个应用程序,其中避免了 DI 以提高性能。服务依赖性作为静态 class 实现,并在调用 class 中直接引用。这给测试带来了典型的挑战,因为不可能为此服务注入存根。
我的第一个想法是设置一个常规的 class 和接口,将其作为单例放入容器中,然后将其注入到调用 class 的构造函数中。此 API 应用对性能非常关键,因此设计选择不能增加任何额外的响应时间。
是否可以在不增加性能开销的情况下使用 DI?如果没有,是否有另一种设计模式可以用来保持性能,同时提高 class 的可测试性?
我 运行 一个简单的测试来验证这一点,发现使用来自 DI 的单例服务不会增加任何显着的性能开销。
我创建了一个带有接口的简单服务并将其注册到服务集合中。我创建了 2 个控制器。在一个中,我使用 new Service() 来获取实例,在另一个中,我通过构造函数注入了它。
我在发布构建模式下启动了该应用程序,并 运行 使用 K6 在每个控制器上进行了负载测试。使用 new Service() 的控制器平均耗时 184.94 微秒,使用注入的控制器平均耗时 186.07 微秒。
所以使用 DI 确实增加了轻微的(百万分之一秒)开销。这可能小到在使用 API.
时不会被注意到