C# Dictionary和Dynamic类型

开发中需要传递变参,考虑使用 dynamic 还是 Dictionary(准确地说是Dictionary<string,object>)。dynamic 的编码体验显著优于 Dictionary,如果性能差距不大的话,我会选择使用dynamic。搜索后没有找到类似对比数据,决定自行实验。

首先使用以下测试代码:

public void TestDynamic()
{
    var e = CallDynamic(new { Value = 0 });
    int v = e.Value;
}

public void TestDictionary()
{
    var dict = new Dictionary<string, object>();
    dict["Value"] = 0;
    dict = CallDictionary(dict);
    int v = (int)dict["Value"];
}

private dynamic CallDynamic(dynamic test)
{
    int v = test.Value;
    v++;
    return new { Value = v };
}

private Dictionary<string, object> CallDictionary(
    Dictionary<string, object> test)
{
    int v = (int)test["Value"];
    v++;
    var dict = new Dictionary<string, object>();
    dict["Value"] = v;
    return dict;
}

分别比较运行 1次、10次、100次、1000次、1e4次、1e5次、1e6次 时间
结果:

其中dynamic列和dynamic2列的数据分别是:

在一次运行中执行一步测试 和 在一次运行中连续执行所有测试

分析测试过程和数据,得到以下结论:

1.dynamic首次使用会产生一定的性能损耗
2.无论是否首次使用,使用次数达到一定量级,dynamic性能一定优于Dictionary
3.一次运行中连续使用dynamic会显著拉低平均性能损耗

考虑到传递变参可能出现多个参数,以上测试不完全。

使用以下代码进行第二阶段实验:

public void InvokeDynamic()
{
    var e = CallDynamic2(
        new { Value1 = 0, Value2 = 0L, Value3 = 0f, Value4 = 0.0, Value5 = "test" });
    int v1 = e.Value1;
    long v2 = e.Value2;
    float v3 = e.Value3;
    double v4 = e.Value4;
    string v5 = e.Value5;
}

public void InvokeDictionary()
{
    var dict = new Dictionary<string, object>();
    dict["Value1"] = 0;
    dict["Value2"] = 0L;
    dict["Value3"] = 0f;
    dict["Value4"] = 0.0;
    dict["Value5"] = "test";
    dict = CallDictionary2(dict);
    int v1 = (int)dict["Value1"];
    long v2 = (long)dict["Value2"];
    float v3 = (float)dict["Value3"];
    double v4 = (double)dict["Value4"];
    string v5 = (string)dict["Value5"];
}

private dynamic CallDynamic2(dynamic test)
{
    int v1 = test.Value1;
    long v2 = test.Value2;
    float v3 = test.Value3;
    double v4 = test.Value4;
    string v5 = test.Value5;
    v1++;
    v2++;
    v3++;
    v4++;
    v5 += "test";
    return new { Value1 = v1, Value2 = v2, Value3 = v3, Value4 = v4, Value5 = v5 };
}

private Dictionary<string, object> CallDictionary2(
    Dictionary<string, object> test)
{
    int v1 = (int)test["Value1"];
    long v2 = (long)test["Value2"];
    float v3 = (float)test["Value3"];
    double v4 = (double)test["Value4"];
    string v5 = (string)test["Value5"];
    v1++;
    v2++;
    v3++;
    v4++;
    v5 += "test";
    var dict = new Dictionary<string, object>();
    dict["Value1"] = v1;
    dict["Value2"] = v2;
    dict["Value3"] = v3;
    dict["Value4"] = v4;
    dict["Value5"] = v5;
    return dict;
}

结果数据:

最后决定选择使用dynamic

有兄弟考虑可能Box损耗了性能导致Dictionary表现不佳,
专门做了第三阶段实验,对比dynamic和Dictionary<string,long>

具体数据不贴了,结果是dynamic在100000量级快一倍

时间: 2024-11-10 13:04:55

C# Dictionary和Dynamic类型的相关文章

教你在你的应用程序中扩展使用dynamic类型

教你在你的应用程序中扩展使用dynamic类型 相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展一些实际中的应用,方便开发过程中使用,来提高大家的工作效率等.这里我给大家介绍一个简单的,解析xml的扩展类. 先新建一个类,DynamicXmlNode 继承自DynamicObject,然后我们输入override,看一下,都有哪些方法可以重写的: 看到其中有2个方法,感觉很接近我们要用的,我这

C# dynamic类型

dynamic类型是C#4.0中引入的新类型,它允许其操作掠过编译器类型检查,而在运行时处理.dynami类型在绝大多数情况下和object类型相似,不同之处在于编译器对于包含了dynamic的表达式不做进一步解析和类型检查.编译器将这些信息收集到一起,用于在运行时鉴定操作.也就是具体类型在运行时程序才知道.实际上,dynamic类型的变量被编译成object类型,因此,dynamic类型实际上只存在于编译期,而运行时并不存在. 先来看一段有趣的代码: static void Main(stri

C#高级编程七十天----dynamic类型

dynamic类型 C#新增了dynamic关键字,正是因为这一个小小的关键字,C#像前迈进了一大步. dynamic是一个类型关键,声明为dynamic的类型与"静态类型"(这里的静态是指编译时确定的类型,例如int,double类型)相比最大的特定它是"动态类型",它会在运行时尝试调用方法,这些方法的存在与否不是编译时期检查的,而是在运行时查找,如果方法存在并且参数正确,会正确调用,否则会抛出异常. 案例: dynamic d = Console.Out; dy

C# 使用dynamic类型来访问JObject对象

原文:C# 使用dynamic类型来访问JObject对象 dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便. 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型.但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦.我们可以借助DynamicObject来访问对应的属性. DynamicObject 我们要创建一个动态类,用于访问JObject,代码如下: pu

c# 确定dynamic类型的数据对象是否存在某个属性

原文:c# 确定dynamic类型的数据对象是否存在某个属性 public static bool IsPropertyExist(dynamic data, string propertyname) { if (data is ExpandoObject) return ((IDictionary<string, object>)data).ContainsKey(propertyname); return data.GetType().GetProperty(propertyname) !

Data Dictionary and Dynamic Performance Views(数据字典和动态性能视图)

Overview of the Data Dictionary Because Oracle Database stores data dictionary data in tables, just like other data, users can query the data with SQL. Contents of the Data Dictionary The data dictionary consists of the following types of objects: Ba

dynamic 类型不能访问属性

x //解决方案ProjectTest.项目A里面public object r(){ return new {id = 1,name = "zf"}; } //解决方案ProjectTest.项目B里面 public void GetR(){ var aObj = 项目A.r(); //报错:dynamic明明看到了字段,访问出错Microsoft.CSharp.RuntimeBinder.RuntimeBinderException   var id = aObj.id; } 去M

dynamic类型----4.0新特性

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Dynamic; namespace ConsoleApplication4 {     class Program     {         static void Main(string[] args)         {       

EF将IEnumerable&lt;T&gt;类型转换为Dictionary&lt;T,T&gt;类型

x 无标题 #region 博客Code {DBEntities}生成EFModel的时候自己命名的 using ({DBEntities} db = new { DBEntities }()) { var que = (from c in db.CollectItem select c).ToList(); List<Dictionary<string, object>> retList = new List<Dictionary<string, object>