当前位置: 首页 > 编程笔记 >

C#中Dynamic和Dictionary性能比较

俞博涛
2023-03-14
本文向大家介绍C#中Dynamic和Dictionary性能比较,包括了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性能比较,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • He called the crowd with his disciples, and said to them,"If any want to become my followers, let them deny themseleves and take up their cross and follow me. For those who want to save their life wil

  • 本文向大家介绍golang、python、php、c++、c、java、Nodejs性能对比,包括了golang、python、php、c++、c、java、Nodejs性能对比的使用技巧和注意事项,需要的朋友参考一下   本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不得不用神奇的斐波那契算法。可能是比较常用或好玩吧。   好了,tal

  • 很好地理解动态内存如何在C ++中真正起作用对于成为一名优秀的C ++程序员至关重要。 C ++程序中的内存分为两部分 - The stack - 在函数内声明的所有变量将从堆栈中占用内存。 The heap - 这是程序未使用的内存,可用于在程序运行时动态分配内存。 很多时候,您事先并不知道在特定变量中存储特定信息需要多少内存,并且可以在运行时确定所需内存的大小。 您可以使用C ++中的特殊运算

  • 本文向大家介绍C#中的HashTable和Dictionary之间的区别,包括了C#中的HashTable和Dictionary之间的区别的使用技巧和注意事项,需要的朋友参考一下 HashTable和Dictionary都是用于存储数据的数据结构的类型。这两个数据结构都将存储的数据保存为键值对。 根据这些关键特征之间的区别,我们可以区分HashTable和Dictionary,如下所示: 序号 键

  • 本文向大家介绍C#中var和dynamic之间的区别,包括了C#中var和dynamic之间的区别的使用技巧和注意事项,需要的朋友参考一下 我们知道,任何语言的编程都以声明变量开始,然后对其进行定义和逻辑实现。因此,最重要的因素之一就是知道在开始用任何编程语言声明变量之前如何对其进行编码。 现在,如果我们使用C#语言的实例,则变量的声明会随着语言的发展而变化。与以前的C#版本一样,所有编写的代码都

  • 问题内容: Java中比较和交换的语义是什么?即,公正的比较和交换方法是保证不同线程之间对原子整数实例的特定内存位置的有序访问,还是保证对内存中所有位置的有序访问,即,它的行为就像是易失的(内存围栏)。 从文档: 原子地读取和有条件地写入变量,但不会在排序之前创建任何事件,因此,对于除的目标以外的任何变量的先前或后续读取和写入不提供任何保证。 以及所有其他读取和更新操作(例如,具有读取和写入易失性