开发中需要传递变参,考虑使用 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量级快一倍

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

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

    教你在你的应用程序中扩展使用dynamic类型 相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展 ...

  2. C# dynamic类型序列化和反序列化之Newtonsoft.Json,动态解析远端返回的jSON数据

    一.说明 1.Newtonsoft.Json 中的Linq To Json中提供了方便的json数据查询.修改等操作. 例如:JObject,JArray 2.在JObject.FromObject( ...

  3. C# dynamic类型序列化和反序列化之Newtonsoft.Json

    原文:C# dynamic类型序列化和反序列化之Newtonsoft.Json 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011127019/ ...

  4. 使用dynamic类型改进反射

    首先还是声明一下,使用场景: 1.如果编译时函数名称确定,对象类型运行时确定,那么运用dynamic是一个好主意.2.如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynam ...

  5. C# - dynamic 类型

    C#4引入dynamic关键字,定义变量时,可以不初始化它的值. dynamic类型仅在编译期间存在,在运行期间会被System.Object类型替代. dynamic myDynamicVar; m ...

  6. C# dynamic类型

    dynamic类型是C#4.0中引入的新类型,它允许其操作掠过编译器类型检查,而在运行时处理.dynami类型在绝大多数情况下和object类型相似,不同之处在于编译器对于包含了dynamic的表达式 ...

  7. 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTtful API

    上一篇写的是使用静态基类方法的实现步骤:  http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...

  8. C#编程(七十)----------dynamic类型

    原文链接 : http://blog.csdn.net/shanyongxu/article/details/47296033 dynamic类型 C#新增了dynamic关键字,正是因为这一个小小的 ...

  9. c#中的dynamic类型

    dynamic是C#4.0引入的全新类型,它允许其操作略过编译期类型检查,而在运行时期处理. dynamic类型在大多数情况下和object类似,不同点在于编译器对于dynamic类型的 数据不做进一 ...

随机推荐

  1. Java异常-一般异常和运行时异常的区别

    Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常, JA ...

  2. du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...

  3. 【CodeForces 577B】Modulo Sum

    题 题意 给你n(1 ≤ n ≤ 106)个数a1..an(0 ≤ ai ≤ 109),再给你m( 2 ≤ m ≤ 103)如果n个数的子集的和可以被m整除,则输出YES,否则NO. 分析 分两种情况 ...

  4. 学习笔记--博弈组合-SG函数

    fye学姐的测试唯一的水题.... SG函数是一种游戏图每个节点的评估函数 具体定义为: mex(minimal excludant)是定义在整数集合上的操作.它的自变量是任意整数集合,函数值是不属于 ...

  5. POJ3169 Layout

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  6. Android视频直播解决方案(rstp、udp)

    做局域网视频直播有两种方案,通过rstp或udp协议. 1.rstp协议,网络上有个开源项目,基于Android,且这个项目也是一个服务端,里面也集成了http访问页面,可以通过http或者rstp直 ...

  7. 根据.MDF文件查看 SQL数据库的版本信息

    http://www.cnblogs.com/eason-chan/p/3695753.html?utm_source=tuicool 手上有 经理带来的一个教学管理系统,由于不知道开发环境,在向SQ ...

  8. Appserv环境下搭建的PHP环境升级PHP版本(支持微信端口以及thinkphp)

      Appserv 2.5.10 升级PHP from version 5.2 to 5.3 最近,在使用Appserv 2.5.10 中的PHP开发微信时,遇到下面错误 Fatal error  C ...

  9. User表格式

    "_id":基本是700多 "name":"xx01" "pwd":"123"

  10. IE 兼容模式下不支持DIV CSS样式display:inline-block,解决

    样式改为: display: inline-block;*display: inline;zoom: 1; 就可以了