From cf7c8629ff6244711cb4da7c6e5518a30e2fe177 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 19 Mar 2018 00:19:54 -0700 Subject: [PATCH] Use ActivatorUtlities.CreateFactory instead of CreateInstance (#1643) * Use ActivatorUtlities.CreateFactory instead of CreateInstance - Turns out CreateFactory is much much faster - Added a benchmark for hub activation --- .../DefaultHubActivatorBenchmark.cs | 37 +++++++++++++++++++ .../DefaultHubActivator.cs | 4 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 benchmarks/Microsoft.AspNetCore.SignalR.Microbenchmarks/DefaultHubActivatorBenchmark.cs 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; }