ReactivePropertySlim のほうが早いよ。という説明はしましたが、どれくらい早いのか見てみましょう。
こういうとき便利なのが BenchmarkDotNet ですね。
ReactivePropertySlim の高速化のポイントの 1 つにインスタンス作成時のメモリアロケーションを最低限におさえるというのがあるように見えます(作ったの @neuecc さんなのでコード見てる雰囲気で…)。一方 ReactiveProperty はインスタンス作成時にちょっとした処理をしていたりします。では、どれくらい違うのか以下のようなベンチマークを書いてみました。
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Reactive.Bindings;
using System;
using System.Reactive.Subjects;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run<ReactivePropertyBehcnmark>();
}
}
public class ReactivePropertyBehcnmark
{
[Benchmark]
public ReactiveProperty<string> ReactivePropertyDefaultConstructor() => new ReactiveProperty<string>();
[Benchmark]
public ReactivePropertySlim<string> ReactivePropertySlimDefaultConstructor() => new ReactivePropertySlim<string>();
}
}
実行結果は以下の通りです。
| Method | Mean | Error | StdDev |
|--------------------------------------- |----------:|----------:|----------:|
| ReactivePropertyDefaultConstructor | 90.127 ns | 1.2563 ns | 1.1752 ns |
| ReactivePropertySlimDefaultConstructor | 5.383 ns | 0.1262 ns | 0.1181 ns |
はい。平均で 18 倍ほど ReactiveProperty のほうが new しただけで遅いですね。これでも ReactiveProperty も早くなるように努力したのですが、これ以上は今の自分だと Slim に迫ることはできませんでした。
この他にもスレッドのディスパッチとかしてないのもあって値の設定とかでも Slim のほうが早いはずです。興味のある方は試してみるといいかも。
まとめ
早い。