属性字典的速度比使用switch语句慢

时间:2014-10-28 14:31:28

标签: c# dictionary reflection

我目前有一个班级' ArisingViewModel'它有大约20-30个属性,当我生成各种数据时,将检查10,000次以上。

最初我有一个方法从XML字符串中检索出现的属性值:

    public object GetArisingPropertyValue(string propertyName)
    {
        switch (propertyName)
        {
            case "name_1":
                return Name1;
            case "another_name":
                return AnotherName;

            // etc.
        }
    }

但是这适用于使用属性字典,以便更容易更新,并使项目的其他部分更容易生活。所以我设置了我的属性字典:

    private static readonly IDictionary<string, string> PropertyMap;


    static ArisingViewModel()
    {
        PropertyMap = new Dictionary<string, string>();

        var myType = typeof(ArisingViewModel);

        foreach (var propertyInfo in myType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            if (propertyInfo.GetGetMethod() != null)
            {
                var attr = propertyInfo.GetCustomAttribute<FieldNameAttribute>();

                if (attr == null)
                    continue;

                PropertyMap.Add(attr.FieldName, propertyInfo.Name);
            }
        }
    }

我将属性应用于任何相关的属性,如:

    [FieldName("name_1")]
    public string Name1
    {
        get
        {
            return _arisingRecord.Name1;
        }
    }

然后使用以下方法查找属性名称/值:

    public static string GetPropertyMap(string groupingField)
    {
        string propName;
        PropertyMap.TryGetValue(groupingField, out propName);
        return propName; //will return null in case map not found.
    }

    public static object GetPropertyValue(object obj, string propertyName)
    {
        return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
    }

我的问题是,我发现使用旧的switch语句可以更快地处理(使用非常简单的计时器类来测量系统的使用时间 - 约20秒vs~25秒)

任何人都可以建议我做错了什么,或者改进当前代码的方法吗?

1 个答案:

答案 0 :(得分:1)

我建议从StringTemplate 4的C#端口(BSD 3子句许可证)实现类似于ObjectModelAdaptor的类。此功能在模板渲染管道的性能关键部分中大量使用,并且分析表明当前实现执行得非常好。

此类使用相当有效的缓存和分发机制,但可以使用ConcurrentDictionary并删除lock语句来改进.NET 4+用户。

您可能希望更改FindMember的实现,以使用属性实现特定于您的属性的逻辑。