C#中Dynamic和Dictionary性能比较

作者:Sartrey Lee 时间:2022-05-11 12:16:33 

开发中需要传递变参,考虑使用 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次 时间

结果:

C#中Dynamic和Dictionary性能比较

其中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;
}

结果数据:

C#中Dynamic和Dictionary性能比较

最后决定选择使用dynamic

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

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

以上所述是小编给大家介绍的C#中Dynamic和Dictionary性能比较网站的支持!

来源:http://www.cnblogs.com/sartrey/archive/2015/03/10/performance-between-dynamic-and-dictionary.html

标签:dynamic,dictionary,性能
0
投稿

猜你喜欢

  • Java持久化框架Hibernate与Mybatis优劣及选择详解

    2023-12-03 19:46:14
  • 手把手教你搭建SpringMVC框架——最小化配置

    2022-02-16 02:38:16
  • SpringBoot实用小技巧之如何动态设置日志级别

    2023-02-09 04:27:58
  • Android入门之实现自定义Adapter

    2021-09-30 17:34:10
  • c# winform取消右上角关闭按钮的实现方法

    2023-05-05 18:56:28
  • 生成8位随机不重复的数字编号的方法

    2023-11-26 07:00:29
  • Android开发中Intent.Action各种常见的作用汇总

    2022-10-08 10:24:53
  • Android自定义弹出框dialog效果

    2023-06-29 14:14:32
  • c#窗体传值用法实例详解

    2022-04-04 03:44:15
  • android的RecyclerView实现拖拽排序和侧滑删除示例

    2023-10-06 01:33:32
  • Java排序算法总结之希尔排序

    2022-07-16 13:19:11
  • Web容器启动过程中如何执行Java类

    2022-10-01 19:49:10
  • Maven install 报错"程序包不存在"问题的解决方法

    2021-05-27 06:08:06
  • UnityShader使用速度映射图实现运动模糊

    2021-11-23 03:53:21
  • c#唯一值渲染实例代码

    2023-09-06 06:54:16
  • SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的实现

    2022-03-27 10:47:08
  • 不规范使用ThreadLocal导致bug分析解决

    2023-11-24 20:03:59
  • 用C语言实现五子棋小游戏

    2023-01-19 12:56:58
  • Spring Boot 整合mybatis 使用多数据源的实现方法

    2021-06-16 16:06:10
  • C# 输出字符串到文本文件中的实现代码

    2022-08-25 11:18:13
  • asp之家 软件编程 m.aspxhome.com