-
-
Notifications
You must be signed in to change notification settings - Fork 192
Expand file tree
/
Copy pathSortAndBindChange.cs
More file actions
93 lines (73 loc) · 3.23 KB
/
Copy pathSortAndBindChange.cs
File metadata and controls
93 lines (73 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
namespace DynamicData.Benchmarks.Cache;
[MemoryDiagnoser]
[MarkdownExporterAttribute.GitHub]
public class SortAndBindChange: IDisposable
{
private readonly Random _random = new();
private record Item(string Name, int Id, int Ranking);
private readonly SortExpressionComparer<Item> _comparer = SortExpressionComparer<Item>
.Ascending(i => i.Ranking)
.ThenByAscending(i => i.Name);
Signal<IChangeSet<Item, int>> _newSubject = new();
Signal<IChangeSet<Item, int>> _newSubjectOptimised = new();
Signal<IChangeSet<Item, int>> _oldSubject = new();
Signal<IChangeSet<Item, int>> _oldSubjectOptimised = new();
private IDisposable? _cleanUp;
private ReadOnlyObservableCollection<Item>? _newList;
private ReadOnlyObservableCollection<Item>? _newListOptimised;
private ReadOnlyObservableCollection<Item>? _oldList;
private ReadOnlyObservableCollection<Item>? _oldListOptimised;
[Params(10, 100, 1_000, 10_000, 50_000)]
public int Count { get; set; }
[GlobalSetup]
public void SetUp()
{
_oldSubject = new Signal<IChangeSet<Item, int>>();
_oldSubjectOptimised = new Signal<IChangeSet<Item, int>>();
_newSubject = new Signal<IChangeSet<Item, int>>();
_newSubjectOptimised = new Signal<IChangeSet<Item, int>>();
_cleanUp = new CompositeDisposable
(
_newSubject.SortAndBind(out var newList, _comparer).Subscribe(),
_newSubjectOptimised.SortAndBind(out var optimisedList, _comparer, new SortAndBindOptions
{
InitialCapacity = Count,
UseBinarySearch = true
}).Subscribe(),
_oldSubject.Sort(_comparer).Bind(out var oldList).Subscribe(),
_oldSubjectOptimised.Sort(_comparer, SortOptimisations.ComparesImmutableValuesOnly).Bind(out var oldOptimisedList).Subscribe()
);
_newList = newList;
_newListOptimised = optimisedList;
_oldList = oldList;
_oldListOptimised = oldOptimisedList;
var changeSet = new ChangeSet<Item, int>(Count);
foreach (var i in Enumerable.Range(1, Count))
{
var item = new Item($"Item{i}", i, _random.Next(1, 1000));
changeSet.Add(new Change<Item, int>(ChangeReason.Add, i, item));
}
_newSubject.OnNext(changeSet);
_newSubjectOptimised.OnNext(changeSet);
_oldSubject.OnNext(changeSet);
_oldSubjectOptimised.OnNext(changeSet);
}
[Benchmark(Baseline = true)]
public void Old() => RunTest(_oldSubject, _oldList!);
[Benchmark]
public void OldOptimized() => RunTest(_oldSubjectOptimised, _oldListOptimised!);
[Benchmark]
public void New() => RunTest(_newSubject, _newList!);
[Benchmark]
public void NewOptimized() => RunTest(_newSubjectOptimised, _newListOptimised!);
void RunTest(Signal<IChangeSet<Item, int>> subject, ReadOnlyObservableCollection<Item> list)
{
var original = list[Count / 2];
var updated = original with { Ranking = _random.Next(1, 1000) };
subject.OnNext(new ChangeSet<Item, int>
{
new(ChangeReason.Update, original.Id, updated, original)
});
}
public void Dispose() => _cleanUp?.Dispose();
}