C#比较dynamic和Dictionary性能

简介:

开发中需要传递变参,考虑使用 dynamic 还是 Dictionary(准确地说是Dictionary<string,object>)。dynamic 的编码体验显著优于 Dictionary,如果性能差距不大的话,我会选择使用dynamic。搜索后没有找到类似对比数据,决定自行实验。

首先使用以下测试代码:


 
 
  1. public void TestDynamic() 
  2.     var e = CallDynamic(new { Value = 0 }); 
  3.     int v = e.Value; 
  4.  
  5. public void TestDictionary() 
  6.     var dict = new Dictionary<stringobject>(); 
  7.     dict["Value"] = 0; 
  8.     dict = CallDictionary(dict); 
  9.     int v = (int)dict["Value"]; 
  10.  
  11. private dynamic CallDynamic(dynamic test) 
  12.     int v = test.Value; 
  13.     v++; 
  14.     return new { Value = v }; 
  15.  
  16. private Dictionary<stringobject> CallDictionary( 
  17.     Dictionary<stringobject> test) 
  18.     int v = (int)test["Value"]; 
  19.     v++; 
  20.     var dict = new Dictionary<stringobject>(); 
  21.     dict["Value"] = v; 
  22.     return dict; 

分别比较运行 1次、10次、100次、1000次、1e4次、1e5次、1e6次 时间
结果:

C#比较dynamic和Dictionary性能

其中dynamic列和dynamic2列的数据分别是:

在一次运行中执行一步测试 和 在一次运行中连续执行所有测试

分析测试过程和数据,得到以下结论:

1.dynamic首次使用会产生一定的性能损耗
2.无论是否首次使用,使用次数达到一定量级,dynamic性能一定优于Dictionary
3.一次运行中连续使用dynamic会显著拉低平均性能损耗

考虑到传递变参可能出现多个参数,以上测试不完全。

使用以下代码进行第二阶段实验:


 
 
  1. public void InvokeDynamic() 
  2.     var e = CallDynamic2( 
  3.         new { Value1 = 0, Value2 = 0L, Value3 = 0f, Value4 = 0.0, Value5 = "test" }); 
  4.     int v1 = e.Value1; 
  5.     long v2 = e.Value2; 
  6.     float v3 = e.Value3; 
  7.     double v4 = e.Value4; 
  8.     string v5 = e.Value5; 
  9.  
  10. public void InvokeDictionary() 
  11.     var dict = new Dictionary<stringobject>(); 
  12.     dict["Value1"] = 0; 
  13.     dict["Value2"] = 0L; 
  14.     dict["Value3"] = 0f; 
  15.     dict["Value4"] = 0.0; 
  16.     dict["Value5"] = "test"
  17.     dict = CallDictionary2(dict); 
  18.     int v1 = (int)dict["Value1"]; 
  19.     long v2 = (long)dict["Value2"]; 
  20.     float v3 = (float)dict["Value3"]; 
  21.     double v4 = (double)dict["Value4"]; 
  22.     string v5 = (string)dict["Value5"]; 
  23.  
  24. private dynamic CallDynamic2(dynamic test) 
  25.     int v1 = test.Value1; 
  26.     long v2 = test.Value2; 
  27.     float v3 = test.Value3; 
  28.     double v4 = test.Value4; 
  29.     string v5 = test.Value5; 
  30.     v1++; 
  31.     v2++; 
  32.     v3++; 
  33.     v4++; 
  34.     v5 += "test"
  35.     return new { Value1 = v1, Value2 = v2, Value3 = v3, Value4 = v4, Value5 = v5 }; 
  36.  
  37. private Dictionary<stringobject> CallDictionary2( 
  38.     Dictionary<stringobject> test) 
  39.     int v1 = (int)test["Value1"]; 
  40.     long v2 = (long)test["Value2"]; 
  41.     float v3 = (float)test["Value3"]; 
  42.     double v4 = (double)test["Value4"]; 
  43.     string v5 = (string)test["Value5"]; 
  44.     v1++; 
  45.     v2++; 
  46.     v3++; 
  47.     v4++; 
  48.     v5 += "test"
  49.     var dict = new Dictionary<stringobject>(); 
  50.     dict["Value1"] = v1; 
  51.     dict["Value2"] = v2; 
  52.     dict["Value3"] = v3; 
  53.     dict["Value4"] = v4; 
  54.     dict["Value5"] = v5; 
  55.     return dict; 

结果数据:

C#比较dynamic和Dictionary性能

最后决定选择使用dynamic

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

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


来源:51CTO

相关文章
|
编译器 C# 开发者
C# 10.0中插值字符串的改进:灵活性与性能的双重提升
【1月更文挑战第19天】C# 10.0带来了对插值字符串的显著改进,进一步增强了这一功能的灵活性和性能。插值字符串是C#中处理字符串格式化的一种强大方式,它允许开发者直接在字符串中嵌入变量和表达式。在C# 10.0中,插值字符串不仅获得了语法上的简化,还通过新的编译时优化提高了运行时性能。本文将详细探讨C# 10.0中插值字符串的改进内容,以及这些改进如何为开发者带来更加高效和便捷的编程体验。
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
165 2
|
6月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
300 4
|
存储 API C#
C#之 Dictionary 详解
C#之 Dictionary 详解
276 3
|
缓存 API C#
C# 一分钟浅谈:GraphQL 优化与性能提升
本文介绍了 GraphQL API 的常见性能问题及优化方法,包括解决 N+1 查询问题、避免过度取数据、合理使用缓存及优化解析器性能,提供了 C# 实现示例。
309 33
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
261 11
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
265 10
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
956 13
|
存储 安全 搜索推荐
c#集合_键值对Dictionary & SortedList
在 C# 中,键值对是一种常见的数据结构,可以使用不同的集合类实现。以下是常用的键值对集合类::一种使用哈希表实现的键值对集合。它通过将键哈希为桶号,然后将值存储在桶中进行快速查找。:一种基于数组实现的键值对集合。它会将键值对按照键排序并存储在数组中,以支持快速访问、查找和枚举。:一种使用红黑树实现的键值对集合。它能够按照键的排序进行快速查找,也可以快速地插入和删除键值对,并且该树具备自平衡的特性,使得插入、删除和搜索性能都非常优秀。
616 1
C#-数据类型(dynamic)
C#-数据类型(dynamic)
187 0