C#比较dynamic和Dictionary性能
开发中需要传递变参,考虑使用 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#比较dynamic和Dictionary性能的更多相关文章
- C# Hashtable VS. Dictionary 性能对比
Hashtable VS Dictionary 因为Hashtable的Key和Value都是object类型,所以在使用值类型的时候,必然会出现装箱和拆箱的操作,因此性能肯定是不如Dictionar ...
- C# Dictionary和Dynamic类型
开发中需要传递变参,考虑使用 dynamic 还是 Dictionary(准确地说是Dictionary<string,object>).dynamic 的编码体验显著优于 Diction ...
- 浅谈dynamic的简单使用用法
今天看了博客园里面的dynamic用法,我犹豫从来没接触过,今天恶补了一下,把我对dynamic的认识分享了出来,大家一起学习. Visual C# 2010 引入了一个新类型 dynamic. 该类 ...
- 从内部剖析C# 集合之--Dictionary
Dictionary和hashtable用法有点相似,他们都是基于键值对的数据集合,但实际上他们内部的实现原理有很大的差异, 先简要概述一下他们主要的区别,稍后在分析Dictionary内部实现的大概 ...
- 【基本功】深入剖析Swift性能优化
简介 2014年,苹果公司在WWDC上发布Swift这一新的编程语言.经过几年的发展,Swift已经成为iOS开发语言的“中流砥柱”,Swift提供了非常灵活的高级别特性,例如协议.闭包.泛型等,并且 ...
- 深入剖析Swift性能优化
简介 2014年,苹果公司在WWDC上发布Swift这一新的编程语言.经过几年的发展,Swift已经成为iOS开发语言的“中流砥柱”,Swift提供了非常灵活的高级别特性,例如协议.闭包.泛型等,并且 ...
- 最全的 Swift 4 新特性解析
转自: http://www.jianshu.com/p/f35514ae9c1a WWDC 2017 带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特 ...
- C# - 集合类
C#的集合类命名空间介绍: // 程序集 mscorlib.dll System.dll System.Core.dll // 命名空间 using System.Collections:集合的接口和 ...
- C#动态属性(.NET Framework4.5支持)
获取方法: /* 使用方法: 1. 在web.config 的<configSections> 节点中添加 <section name="customConfigs&quo ...
随机推荐
- iOS9 以上的真机调试 不用证书
具体流程如下: 首次使用AppleID 的注意事项: 要在设置中 进行 如下操作 设置--通用--描述文件 ---添加信任 但是有时候 还是 会不能调试, 显示信息 是这样的 : ...
- string.Format 日期格式化
String.Format日期的格式化例子: DateTime dt = DateTime.Now;//2010年10月4日 17点05分 string str = ""; //s ...
- Unity3d 基础知识学习 工具篇
Unity3d 层(layer)的学习 @广州小龙 unity中的层是个很有用的东西, 点击层的下拉框,点击Add Layer,可以打开层管理器,我新建了一个层为test 他的id值是8,这个后面会 ...
- 检查网口流量与前10名流量大IP
此脚本包含的功能有: 1.实时监控任意网卡的流量 2.统计10秒内平均流量 3.统计每个端口在10秒内的平均流量,基于客户端和服务端端口统计.可以看出哪些端口占流量比较大,对于web服务器,一般是80 ...
- Unity C# 游戏间物体间的访问
脚本语言:C# 1.在Unity工程中新建两个物体:Cube和Sphere 2.分别为Cube和Sphere添加脚本CubeScript和SphereScript: 在SphereScript这两个定 ...
- Pie(二分)
ime Limit: 1000MS Memory Limit: 65536K Total Submissions: 8930 Accepted: 3235 Special Judge De ...
- 黄源河《左偏树的应用》——数字序列(Baltic 2004)
这道题哪里都找不到. [问题描述] 给定一个整数序列a1, a2, … , an,求一个不下降序列b1 ≤ b2 ≤ … ≤ bn,使得数列{ai}和{bi}的各项之差的绝对值之和 |a1 - b1| ...
- Jenkins 十一: 构建Maven项目
1. 点击“新建”,在“Item名称”栏输入要构建的项目名,比如“Maven_project”,选择“构建一个maven项目”,点击“OK”按钮. 2. 找到“源码管理”-> “Subversi ...
- jQuery整体架构源码解析
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- H - Cow Contest
有N头牛,编号从1到N,参与一个变成比赛(大牛编程比赛,一般水水平敢参加???),一些牛的代码比较出色,每头牛都有一个独一无二的技能等级在这些竞争者中. 比赛循环进行在任意两头牛之间(姑且这么翻译吧) ...