From b9949e91f88232df556156f733a7a58a951e96cb Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Mon, 27 Aug 2018 15:20:44 -0700 Subject: [PATCH 1/2] fix: All bench marks are now correctly running --- benchmarks/AutoPersistBenchmark.cs | 50 ++++++++++++ .../CreateReactiveListBenchmark.cs | 9 ++- .../INPCObservableForPropertyBenchmarks.cs | 16 ++-- .../Mocks/MockHostScreen.cs | 0 .../Mocks/MockViewModel.cs | 5 +- benchmarks/NavigationStackBenchmark.cs | 79 +++++++++++++++++++ benchmarks/Program.cs | 14 ++++ .../ReactiveListOperationBenchmark.cs | 17 +++- benchmarks/ReactiveUI.Benchmarks.csproj | 29 +++++++ benchmarks/ReactiveUI.Benchmarks.sln | 2 +- .../AutoPersistBenchmark.cs | 31 -------- benchmarks/ReactiveUI.Benchmarks/Harness.cs | 45 ----------- .../NavigationStackBenchmark.cs | 53 ------------- .../ReactiveUI.Benchmarks.csproj | 19 ----- .../RoutableViewModelMixinsBenchmarks.cs | 13 ++- benchmarks/global.json | 5 ++ benchmarks/xunit.runner.json | 3 + 17 files changed, 220 insertions(+), 170 deletions(-) create mode 100644 benchmarks/AutoPersistBenchmark.cs rename benchmarks/{ReactiveUI.Benchmarks => }/CreateReactiveListBenchmark.cs (89%) rename benchmarks/{ReactiveUI.Benchmarks => }/INPCObservableForPropertyBenchmarks.cs (79%) rename benchmarks/{ReactiveUI.Benchmarks => }/Mocks/MockHostScreen.cs (100%) rename benchmarks/{ReactiveUI.Benchmarks => }/Mocks/MockViewModel.cs (72%) create mode 100644 benchmarks/NavigationStackBenchmark.cs create mode 100644 benchmarks/Program.cs rename benchmarks/{ReactiveUI.Benchmarks => }/ReactiveListOperationBenchmark.cs (81%) create mode 100644 benchmarks/ReactiveUI.Benchmarks.csproj delete mode 100644 benchmarks/ReactiveUI.Benchmarks/AutoPersistBenchmark.cs delete mode 100644 benchmarks/ReactiveUI.Benchmarks/Harness.cs delete mode 100644 benchmarks/ReactiveUI.Benchmarks/NavigationStackBenchmark.cs delete mode 100644 benchmarks/ReactiveUI.Benchmarks/ReactiveUI.Benchmarks.csproj rename benchmarks/{ReactiveUI.Benchmarks => }/RoutableViewModelMixinsBenchmarks.cs (83%) create mode 100644 benchmarks/global.json create mode 100644 benchmarks/xunit.runner.json diff --git a/benchmarks/AutoPersistBenchmark.cs b/benchmarks/AutoPersistBenchmark.cs new file mode 100644 index 0000000000..9080a15271 --- /dev/null +++ b/benchmarks/AutoPersistBenchmark.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.ObjectModel; +using System.Reactive; +using System.Reactive.Disposables; +using System.Reactive.Linq; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Order; + +namespace ReactiveUI.Benchmarks +{ + [ClrJob] + [CoreJob] + [MemoryDiagnoser] + [MarkdownExporterAttribute.GitHub] + public class AutoPersistBenchmark + { + private ReactiveList _collection; + + [GlobalSetup] + public void Setup() + { + _collection = new ReactiveList(new[] + { + new MockViewModel(), + new MockViewModel(), + new MockViewModel(), + new MockViewModel(), + new MockViewModel(), + }); + } + + [Benchmark] + public void AutoPersistCollection() + { + var disposable = _collection.AutoPersistCollection(x => Observable.Create(_ => + { + Console.WriteLine("Done stuff"); + return Disposable.Empty; + }).Select(_ => Unit.Default), TimeSpan.FromMilliseconds(200)); + + for (int i = 0; i < 5; ++i) { + _collection.Add(new MockViewModel()); + } + + _collection.Clear(); + + disposable.Dispose(); + } + } +} diff --git a/benchmarks/ReactiveUI.Benchmarks/CreateReactiveListBenchmark.cs b/benchmarks/CreateReactiveListBenchmark.cs similarity index 89% rename from benchmarks/ReactiveUI.Benchmarks/CreateReactiveListBenchmark.cs rename to benchmarks/CreateReactiveListBenchmark.cs index 377fde9f26..49df882973 100644 --- a/benchmarks/ReactiveUI.Benchmarks/CreateReactiveListBenchmark.cs +++ b/benchmarks/CreateReactiveListBenchmark.cs @@ -2,16 +2,19 @@ using System.Collections.ObjectModel; using System.Linq; using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Order; using BenchmarkDotNet.Toolchains.CsProj; using DynamicData; -namespace ReactiveUI.Benchmarks +#pragma warning disable CS0618 // Item is obsolete warning + +namespace ReactiveUI.Benchmarks.Legacy { + [ClrJob] [CoreJob] + [MemoryDiagnoser] [MarkdownExporterAttribute.GitHub] public class CreateReactiveListBenchmark { diff --git a/benchmarks/ReactiveUI.Benchmarks/INPCObservableForPropertyBenchmarks.cs b/benchmarks/INPCObservableForPropertyBenchmarks.cs similarity index 79% rename from benchmarks/ReactiveUI.Benchmarks/INPCObservableForPropertyBenchmarks.cs rename to benchmarks/INPCObservableForPropertyBenchmarks.cs index 624740d052..ec896d0d44 100644 --- a/benchmarks/ReactiveUI.Benchmarks/INPCObservableForPropertyBenchmarks.cs +++ b/benchmarks/INPCObservableForPropertyBenchmarks.cs @@ -1,20 +1,16 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq.Expressions; using System.Runtime.CompilerServices; using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Columns; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; +using BenchmarkDotNet.Order; namespace ReactiveUI.Benchmarks { [ClrJob] [CoreJob] - [MonoJob] - [RPlotExporter] - [RankColumn] + [MemoryDiagnoser] [MarkdownExporterAttribute.GitHub] public class INPCObservableForPropertyBenchmarks { @@ -37,7 +33,8 @@ public void PropertyBinding() var testClass = new TestClassChanged(); var changes = new List>(); - instance.GetNotificationForProperty(testClass, exp, propertyName, false).Subscribe(c => changes.Add(c)); + var dispose = instance.GetNotificationForProperty(testClass, exp, propertyName, false).Subscribe(c => changes.Add(c)); + dispose.Dispose(); } private class TestClassChanged : INotifyPropertyChanged @@ -70,8 +67,7 @@ public string Property2 public void OnPropertyChanged([CallerMemberName] string propertyName = null) { - var handler = PropertyChanged; - if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } diff --git a/benchmarks/ReactiveUI.Benchmarks/Mocks/MockHostScreen.cs b/benchmarks/Mocks/MockHostScreen.cs similarity index 100% rename from benchmarks/ReactiveUI.Benchmarks/Mocks/MockHostScreen.cs rename to benchmarks/Mocks/MockHostScreen.cs diff --git a/benchmarks/ReactiveUI.Benchmarks/Mocks/MockViewModel.cs b/benchmarks/Mocks/MockViewModel.cs similarity index 72% rename from benchmarks/ReactiveUI.Benchmarks/Mocks/MockViewModel.cs rename to benchmarks/Mocks/MockViewModel.cs index cef8343b3f..06d184b565 100644 --- a/benchmarks/ReactiveUI.Benchmarks/Mocks/MockViewModel.cs +++ b/benchmarks/Mocks/MockViewModel.cs @@ -1,5 +1,8 @@ -namespace ReactiveUI.Benchmarks +using System.Runtime.Serialization; + +namespace ReactiveUI.Benchmarks { + [DataContract] public class MockViewModel : ReactiveObject, IRoutableViewModel { public IScreen HostScreen { get; } diff --git a/benchmarks/NavigationStackBenchmark.cs b/benchmarks/NavigationStackBenchmark.cs new file mode 100644 index 0000000000..f7ff739ea0 --- /dev/null +++ b/benchmarks/NavigationStackBenchmark.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq; +using System.Reactive.Concurrency; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Order; + +namespace ReactiveUI.Benchmarks +{ + [ClrJob] + [CoreJob] + [MemoryDiagnoser] + [MarkdownExporterAttribute.GitHub] + public class NavigationStackBenchmark + { + private static readonly Func _mockViewModel; + private RoutingState _router; + + static NavigationStackBenchmark() + { + _mockViewModel = () => new MockViewModel(); + } + + [GlobalCleanup] + public void Cleanup() + { + _router.NavigationStack.Clear(); + _router = null; + } + + [IterationSetup] + public void IterationSetup() + { + _router.NavigationStack.Clear(); + } + + [Benchmark] + public void Navigate() + { + using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) { + _router.NavigationStack.ToList(); + } + } + + [Benchmark] + public void NavigateAndReset() + { + using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) { + _router.NavigationStack.ToList(); + } + } + + [Benchmark] + public void NavigateBack() + { + using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) + using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) + using (_router.NavigateBack.Execute().Subscribe()) { + + } + } + + [Benchmark] + public void NavigationStack() + { + using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) { + _router.NavigationStack.ToList(); + } + } + + [Benchmark] + public void RoutingState() => new RoutingState(); + + [GlobalSetup] + public void Setup() + { + _router = new RoutingState(ImmediateScheduler.Instance); + } + } +} diff --git a/benchmarks/Program.cs b/benchmarks/Program.cs new file mode 100644 index 0000000000..bc333b7dc0 --- /dev/null +++ b/benchmarks/Program.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BenchmarkDotNet.Running; + +namespace ReactiveUI.Benchmarks +{ + class Program + { + static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); + } +} diff --git a/benchmarks/ReactiveUI.Benchmarks/ReactiveListOperationBenchmark.cs b/benchmarks/ReactiveListOperationBenchmark.cs similarity index 81% rename from benchmarks/ReactiveUI.Benchmarks/ReactiveListOperationBenchmark.cs rename to benchmarks/ReactiveListOperationBenchmark.cs index 3be65e3e0a..aad52fb44d 100644 --- a/benchmarks/ReactiveUI.Benchmarks/ReactiveListOperationBenchmark.cs +++ b/benchmarks/ReactiveListOperationBenchmark.cs @@ -1,11 +1,14 @@ using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; +using BenchmarkDotNet.Order; using DynamicData; -namespace ReactiveUI.Benchmarks +#pragma warning disable CS0618 // Item is obsolete warning + +namespace ReactiveUI.Benchmarks.Legacy { + [ClrJob] [CoreJob] + [MemoryDiagnoser] [MarkdownExporterAttribute.GitHub] public class ReactiveListOperationBenchmark { @@ -17,6 +20,12 @@ public void Setup() _reactiveList = new ReactiveList(); } + [IterationSetup] + public void SetupIteration() + { + _reactiveList.Clear(); + } + [GlobalCleanup] public void Teardown() { @@ -53,7 +62,7 @@ public void AddOrInsertRange() => _reactiveList.AddOrInsertRange(new[] }, -1); [Benchmark] - public void Insert() => _reactiveList.Insert(1, "ReactiveUI.Benchmarks"); + public void Insert() => _reactiveList.Insert(0, "ReactiveUI.Benchmarks"); [Benchmark] public void RemoveItem() => _reactiveList.Remove("ReactiveUI"); diff --git a/benchmarks/ReactiveUI.Benchmarks.csproj b/benchmarks/ReactiveUI.Benchmarks.csproj new file mode 100644 index 0000000000..d9a81bbbe4 --- /dev/null +++ b/benchmarks/ReactiveUI.Benchmarks.csproj @@ -0,0 +1,29 @@ + + + + false + net461;netcoreapp2.0 + BenchmarkDotNet.Samples + false + AnyCPU + pdbonly + true + Exe + + + + + + + + + + + + + + + PreserveNewest + + + \ No newline at end of file diff --git a/benchmarks/ReactiveUI.Benchmarks.sln b/benchmarks/ReactiveUI.Benchmarks.sln index cf31995139..c7d61d6356 100644 --- a/benchmarks/ReactiveUI.Benchmarks.sln +++ b/benchmarks/ReactiveUI.Benchmarks.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27703.2000 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.Benchmarks", "ReactiveUI.Benchmarks\ReactiveUI.Benchmarks.csproj", "{EC6DD0F1-4D99-4BE8-B3F1-1DD71D86C24A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactiveUI.Benchmarks", "ReactiveUI.Benchmarks.csproj", "{EC6DD0F1-4D99-4BE8-B3F1-1DD71D86C24A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarks", "benchmarks", "{0DB2C65F-BE8F-4021-8860-D2D6EB9DD80A}" EndProject diff --git a/benchmarks/ReactiveUI.Benchmarks/AutoPersistBenchmark.cs b/benchmarks/ReactiveUI.Benchmarks/AutoPersistBenchmark.cs deleted file mode 100644 index 362dc96a5a..0000000000 --- a/benchmarks/ReactiveUI.Benchmarks/AutoPersistBenchmark.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Reactive; -using System.Reactive.Linq; -using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; - -namespace ReactiveUI.Benchmarks -{ - [CoreJob] - [MarkdownExporterAttribute.GitHub] - public class AutoPersistBenchmark - { - private ReactiveList _collection; - - [GlobalSetup] - public void Setup() - { - _collection = new ReactiveList(new[] - { - "ReactiveUI", - "ReactiveUI.XamForms", - "ReactiveUI.WPF", - "ReactiveUI.Events" - }); - } - - [Benchmark] - public void AutoPersistCollection() => _collection.AutoPersist(x => Observable.Return(Unit.Default), TimeSpan.FromMilliseconds(200)); - } -} diff --git a/benchmarks/ReactiveUI.Benchmarks/Harness.cs b/benchmarks/ReactiveUI.Benchmarks/Harness.cs deleted file mode 100644 index 3c8d93633c..0000000000 --- a/benchmarks/ReactiveUI.Benchmarks/Harness.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using BenchmarkDotNet.Running; -using Xunit; - -namespace ReactiveUI.Benchmarks -{ - public class Harness - { - [Fact] - public void Auto_Persist_Benchmark() - { - BenchmarkRunner.Run(); - } - - [Fact] - public void Create_Reactive_List_Benchmark() - { - BenchmarkRunner.Run(); - } - - [Fact] - public void Reactive_List_Operation_Benchmark() - { - BenchmarkRunner.Run(); - } - - [Fact] - public void Navigation_Reactive_List_Benchmark() - { - BenchmarkRunner.Run(); - } - - [Fact] - public void Routable_View_Model_Mixin_Benchmark() - { - BenchmarkRunner.Run(); - } - - [Fact] - public void INPC_Observable_For_Property_Benchmarks() - { - BenchmarkRunner.Run(); - } - } -} diff --git a/benchmarks/ReactiveUI.Benchmarks/NavigationStackBenchmark.cs b/benchmarks/ReactiveUI.Benchmarks/NavigationStackBenchmark.cs deleted file mode 100644 index b871f35b32..0000000000 --- a/benchmarks/ReactiveUI.Benchmarks/NavigationStackBenchmark.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Linq; -using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; - -namespace ReactiveUI.Benchmarks -{ - [CoreJob] - [MarkdownExporterAttribute.GitHub] - public class NavigationStackBenchmark - { - private Func _mockViewModel; - private RoutingState _router; - - [GlobalCleanup] - public void Cleanup() - { - _router = null; - _mockViewModel = null; - } - - [Benchmark] - public object Navigate() => _router.Navigate.Execute(_mockViewModel()).Subscribe(); - - [Benchmark] - public object NavigateAndReset() => _router.NavigateAndReset.Execute(_mockViewModel()).Subscribe(); - - [Benchmark] - public object NavigateBack() - { - _router.NavigateAndReset.Execute(_mockViewModel()).Subscribe(); - return _router.NavigateBack.Execute().Subscribe(); - } - - [Benchmark] - public object NavigationStack() - { - _router.NavigateAndReset.Execute(_mockViewModel()).Subscribe(); - return _router.NavigationStack.ToList(); - } - - [Benchmark] - public object RoutingState() => new RoutingState(); - - [GlobalSetup] - public void Setup() - { - _router = new RoutingState(); - _mockViewModel = () => new MockViewModel(); - } - } -} diff --git a/benchmarks/ReactiveUI.Benchmarks/ReactiveUI.Benchmarks.csproj b/benchmarks/ReactiveUI.Benchmarks/ReactiveUI.Benchmarks.csproj deleted file mode 100644 index 1a57033af0..0000000000 --- a/benchmarks/ReactiveUI.Benchmarks/ReactiveUI.Benchmarks.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - netcoreapp2.0 - false - - - - - - - - - - - - - - \ No newline at end of file diff --git a/benchmarks/ReactiveUI.Benchmarks/RoutableViewModelMixinsBenchmarks.cs b/benchmarks/RoutableViewModelMixinsBenchmarks.cs similarity index 83% rename from benchmarks/ReactiveUI.Benchmarks/RoutableViewModelMixinsBenchmarks.cs rename to benchmarks/RoutableViewModelMixinsBenchmarks.cs index ec4f0336d0..be1d965355 100644 --- a/benchmarks/ReactiveUI.Benchmarks/RoutableViewModelMixinsBenchmarks.cs +++ b/benchmarks/RoutableViewModelMixinsBenchmarks.cs @@ -2,13 +2,14 @@ using System.Reactive.Concurrency; using System.Reactive.Linq; using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Attributes.Exporters; -using BenchmarkDotNet.Attributes.Jobs; +using BenchmarkDotNet.Order; using ReactiveUI; namespace ReactiveUI.Benchmarks { + [ClrJob] [CoreJob] + [MemoryDiagnoser] [MarkdownExporterAttribute.GitHub] public class RoutableViewModelMixinsBenchmarks { @@ -18,7 +19,7 @@ public class RoutableViewModelMixinsBenchmarks [GlobalSetup] public void Setup() { - _router = new RoutingState(); + _router = new RoutingState(ImmediateScheduler.Instance); _mockViewModel = () => new MockViewModel(); } @@ -29,6 +30,12 @@ public void Cleanup() _mockViewModel = null; } + [IterationSetup] + public void IterationSetup() + { + _router.NavigationStack.Clear(); + } + [Benchmark] public void WhenNavigatedToObservable() { diff --git a/benchmarks/global.json b/benchmarks/global.json new file mode 100644 index 0000000000..0fd9b9b1b9 --- /dev/null +++ b/benchmarks/global.json @@ -0,0 +1,5 @@ +{ + "msbuild-sdks": { + "MSBuild.Sdk.Extras": "1.6.46" + } +} \ No newline at end of file diff --git a/benchmarks/xunit.runner.json b/benchmarks/xunit.runner.json new file mode 100644 index 0000000000..34b2fe2cdd --- /dev/null +++ b/benchmarks/xunit.runner.json @@ -0,0 +1,3 @@ +{ + "shadowCopy": false +} \ No newline at end of file From 94414f00e51cb3b067934185981603e7d5ab091f Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Mon, 27 Aug 2018 16:04:27 -0700 Subject: [PATCH 2/2] fixed formatting issues --- benchmarks/AutoPersistBenchmark.cs | 3 ++- benchmarks/NavigationStackBenchmark.cs | 13 +++++++----- .../RoutableViewModelMixinsBenchmarks.cs | 21 ++++++++----------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/benchmarks/AutoPersistBenchmark.cs b/benchmarks/AutoPersistBenchmark.cs index 9080a15271..87d1cd2a00 100644 --- a/benchmarks/AutoPersistBenchmark.cs +++ b/benchmarks/AutoPersistBenchmark.cs @@ -38,7 +38,8 @@ public void AutoPersistCollection() return Disposable.Empty; }).Select(_ => Unit.Default), TimeSpan.FromMilliseconds(200)); - for (int i = 0; i < 5; ++i) { + for (int i = 0; i < 5; ++i) + { _collection.Add(new MockViewModel()); } diff --git a/benchmarks/NavigationStackBenchmark.cs b/benchmarks/NavigationStackBenchmark.cs index f7ff739ea0..23d47ffd4d 100644 --- a/benchmarks/NavigationStackBenchmark.cs +++ b/benchmarks/NavigationStackBenchmark.cs @@ -36,7 +36,8 @@ public void IterationSetup() [Benchmark] public void Navigate() { - using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) { + using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) + { _router.NavigationStack.ToList(); } } @@ -44,7 +45,8 @@ public void Navigate() [Benchmark] public void NavigateAndReset() { - using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) { + using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) + { _router.NavigationStack.ToList(); } } @@ -54,15 +56,16 @@ public void NavigateBack() { using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) - using (_router.NavigateBack.Execute().Subscribe()) { - + using (_router.NavigateBack.Execute().Subscribe()) + { } } [Benchmark] public void NavigationStack() { - using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) { + using (_router.NavigateAndReset.Execute(_mockViewModel()).Subscribe()) + { _router.NavigationStack.ToList(); } } diff --git a/benchmarks/RoutableViewModelMixinsBenchmarks.cs b/benchmarks/RoutableViewModelMixinsBenchmarks.cs index be1d965355..1ac18e1d60 100644 --- a/benchmarks/RoutableViewModelMixinsBenchmarks.cs +++ b/benchmarks/RoutableViewModelMixinsBenchmarks.cs @@ -39,23 +39,20 @@ public void IterationSetup() [Benchmark] public void WhenNavigatedToObservable() { - _mockViewModel() - .WhenNavigatedToObservable() - .Subscribe(x => - { - Console.WriteLine("Observed"); - }); - - _router.Navigate - .Execute(_mockViewModel()).Subscribe(); + using (_mockViewModel().WhenNavigatedToObservable().Subscribe(x => Console.WriteLine("Observed"))) + using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) + { + } } [Benchmark] public void WhenNavigatingFromObservable() { - _router.Navigate.Execute(_mockViewModel()).Subscribe(); - _mockViewModel().WhenNavigatingFromObservable().Subscribe(); - _router.NavigateBack.Execute().Subscribe(); + using (_router.Navigate.Execute(_mockViewModel()).Subscribe()) + using (_mockViewModel().WhenNavigatingFromObservable().Subscribe()) + using (_router.NavigateBack.Execute().Subscribe()) + { + } } } }