diff --git a/benchmarks/Microsoft.AspNetCore.SignalR.Microbenchmarks/DefaultHubActivatorBenchmark.cs b/benchmarks/Microsoft.AspNetCore.SignalR.Microbenchmarks/DefaultHubActivatorBenchmark.cs new file mode 100644 index 0000000000..f20abf1c72 --- /dev/null +++ b/benchmarks/Microsoft.AspNetCore.SignalR.Microbenchmarks/DefaultHubActivatorBenchmark.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BenchmarkDotNet.Attributes; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.SignalR.Microbenchmarks +{ + public class DefaultHubActivatorBenchmark + { + private DefaultHubActivator _activator; + + [GlobalSetup] + public void GlobalSetup() + { + var services = new ServiceCollection(); + + _activator = new DefaultHubActivator(services.BuildServiceProvider()); + } + + [Benchmark] + public int Create() + { + var hub = _activator.Create(); + int result = hub.Addition(); + return result; + } + + public class MyHub : Hub + { + public int Addition() + { + return 1 + 1; + } + } + } +} diff --git a/src/Microsoft.AspNetCore.SignalR.Core/DefaultHubActivator.cs b/src/Microsoft.AspNetCore.SignalR.Core/DefaultHubActivator.cs index cea440670b..7fd3ff10d6 100644 --- a/src/Microsoft.AspNetCore.SignalR.Core/DefaultHubActivator.cs +++ b/src/Microsoft.AspNetCore.SignalR.Core/DefaultHubActivator.cs @@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.SignalR { public class DefaultHubActivator : IHubActivator where THub: Hub { + // Object factory for THub instances + private static readonly Lazy _objectFactory = new Lazy(() => ActivatorUtilities.CreateFactory(typeof(THub), Type.EmptyTypes)); private readonly IServiceProvider _serviceProvider; private bool? _created; @@ -25,7 +27,7 @@ namespace Microsoft.AspNetCore.SignalR var hub = _serviceProvider.GetService(); if (hub == null) { - hub = ActivatorUtilities.CreateInstance(_serviceProvider); + hub = (THub)_objectFactory.Value(_serviceProvider, Array.Empty()); _created = true; }