-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathComparison_Creation_TwoWay.cs
150 lines (123 loc) · 3.99 KB
/
Comparison_Creation_TwoWay.cs
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using BenchmarkDotNet.Attributes;
using EBind.Test.Models;
using GalaSoft.MvvmLight.Helpers;
using MugenMvvmToolkit;
using MugenMvvmToolkit.Binding;
using MvvmCross.Binding.BindingContext;
using ReactiveUI;
namespace EBind.Benchmarks
{
public class Comparison_Creation_TwoWay : IViewFor<NotifyPropertyChangedEventObject>
{
private readonly MvxBindingContextOwner _mvxContextOwner = new();
private readonly XamarinForms.SimplestBindableObject _xamarinFormsTarget = new();
private NotifyPropertyChangedEventObject? _target;
private NotifyPropertyChangedEventObject? _source;
#region ReactiveUI IViewFor
public NotifyPropertyChangedEventObject? ViewModel
{
get => _source;
set { }
}
object? IViewFor.ViewModel
{
get => _source;
set { }
}
#endregion
[GlobalSetup]
public void Setup()
{
MvvmCrossInitializer.Init();
MugenToolkitInitializer.Init();
_target = new NotifyPropertyChangedEventObject();
_source = new NotifyPropertyChangedEventObject
{
IntValue = 1
};
}
[Benchmark(Baseline = true)]
public void EBind()
{
_target!.IntValue = 0;
var b = new EBinding()
{
BindFlag.TwoWay,
() => _target.IntValue == _source!.IntValue,
};
b.Dispose();
}
[Benchmark]
public void Mugen()
{
_target!.IntValue = 0;
var b = _target.Bind(() => t => t.IntValue)
.To(_source, () => (s, _) => s!.IntValue)
.TwoWay()
.Build();
b.Dispose();
}
[Benchmark]
public void MvvmLight()
{
_target!.IntValue = 0;
var b = new Binding<int, int>(
_source, () => _source!.IntValue,
_target, () => _target.IntValue,
BindingMode.TwoWay);
b.Detach();
}
[Benchmark]
public void MvvmCross()
{
_target!.IntValue = 0;
_mvxContextOwner.CreateBinding(_target)
.For(x => x.IntValue)
.To<NotifyPropertyChangedEventObject>(obj => obj.IntValue)
.TwoWay()
.Apply();
_mvxContextOwner.ClearAllBindings();
}
[Benchmark]
public void ReactiveUI()
{
_target!.IntValue = 0;
var b = this.Bind(_source,
x => x.IntValue,
v => v._target!.IntValue);
b.Dispose();
}
[Benchmark]
public void PraeclarumBind()
{
_target!.IntValue = 0;
var b = Praeclarum.Bind.Binding.Create(() => _target.IntValue == _source!.IntValue);
b.Unbind();
}
[Benchmark]
public void XamarinFormsCompiled()
{
var binding = new Xamarin.Forms.Internals.TypedBinding<NotifyPropertyChangedEventObject, int>(
getter: s => (s.IntValue, true),
setter: (s, v) => s.IntValue = v,
handlers: new[]
{
Tuple.Create<Func<NotifyPropertyChangedEventObject, object>, string>(s => s, nameof(NotifyPropertyChangedEventObject.IntValue))
})
{
Mode = Xamarin.Forms.BindingMode.TwoWay,
};
_xamarinFormsTarget.BindingContext = _source;
_xamarinFormsTarget.SetBinding(XamarinForms.SimplestBindableObject.ValueProperty, binding);
_xamarinFormsTarget.BindingContext = null;
_xamarinFormsTarget.RemoveBinding(XamarinForms.SimplestBindableObject.ValueProperty);
}
[GlobalCleanup]
public void Cleanup()
{
_target = null;
_source = null;
}
}
}