tmytのらくがき

個人の日記レベルです

UWP界の彗星は本当に速いのか

TypeConverterのないUWP界の彗星のようだ。と勝手によんでるXamlBindingHelper.ConvertValue ちゃん、圧倒的に速いでしょそりゃ。とか言ってたけど計測していなかったので計測してみました。

private static Func<string, string, object> typeConverthelperConvertFunc;

private static object ConvertType(string from, Type type)
{
    return typeConverthelperConvertFunc(from, type.FullName);
}

public MainPage()
{
    this.InitializeComponent();

    // Get Internal method
    string typeName = typeof(EventTriggerBehavior).AssemblyQualifiedName
        .Replace(".EventTriggerBehavior,", ".TypeConverterHelper,");
    Type typeConverterHelperType = Type.GetType(typeName);
    MethodInfo typeConverterHelperConvert = typeConverterHelperType
        .GetRuntimeMethod("Convert", new[] { typeof(string), typeof(string) });

    // Lambdaにするよ
    var p1 = Expression.Parameter(typeof(string), "from");
    var p2 = Expression.Parameter(typeof(string), "type");
    var m = Expression.Call(null, typeConverterHelperConvert, p1, p2);
    typeConverthelperConvertFunc = Expression.Lambda<Func<string, string, object>>(m, p1, p2).Compile();
}

private void MainPage_OnLoaded(object sender, RoutedEventArgs ev)
{
    Thickness x;
    var sw = new Stopwatch();
    sw.Start();
    for (var i = 0; i < 100000; ++i)
    {
        x = (Thickness)Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(Thickness), "1,2");
    }
    c1.Text = (sw.ElapsedMilliseconds / 100000.0).ToString();
    c3.Text = x.ToString();
    sw.Restart();
    for (var i = 0; i < 100000; ++i)
    {
        x = (Thickness)ConvertType("1,2", typeof(Thickness));
    }
    c2.Text = (sw.ElapsedMilliseconds / 100000.0).ToString();
    c4.Text = x.ToString();
}

適当に代入したりしてますがあんまり気にしないで。結果ですが、こんな感じ。

f:id:tmyt:20151019230559p:plain

上から、XamlBindingHelper.ConvertValue、BehaviorSDKのメソッド。一応リフレクションのところは式木でラムダにしてみたりしてみたものの一桁速度が違いますね。

結論

やっぱりXamlBindingHelper.ConvertValueはすごいや!!