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 ...
随机推荐
- 原 IOS之NSValue整理
原 IOS之NSValue整理 发表于2年前(2013-02-28 23:02) 阅读(1974) | 评论(0) 5人收藏此文章, 我要收藏 赞3 IOS NSValue 值对象(value o ...
- BZOJ 3570 动物园
Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...
- 舍伍德(Sherwood)算法学习笔记
一.概念引入 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x).设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为.这显然不能排除存在x∈ ...
- Dll方式的线程,需要引用这个
{== D6DLLSynchronizer =================================================} {: This unit handles the D6 ...
- Java NIO API详解
在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API.对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端 ...
- Linux Shell脚本Ldd命令原理及使用方法
1.首先ldd不是一个可执行程序,而只是一个shell脚本2.ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量如下:LD_TRACE_LOADED_OBJECTS.LD ...
- 【转】EditText大小(长宽)的多种设置方式----不错
原文网址:http://orgcent.com/android-edittext-ems-layout-minwidth-maxheight/ EditText大小的设置有多种方式,要想对每种方式运用 ...
- bluetooth记录
1. 网址 Client Characteristic Configuration https://developer.bluetooth.org/gatt/descriptors/Pages/Des ...
- 未在本地计算机上注册"MSDAORA.1"提供程序
1.在客户机器上部署数据库的时候老是报这个异常. 分析:因为用的是OleDB这个万能驱动, 连接字符串 Provider=MSDAORA.1;Password=CCIM;User ID=CCIM;Da ...
- android画虚线的自定义VIew
package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Con ...