千家信息网

C#怎么比较dynamic和Dictionary性能

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,C#怎么比较dynamic和Dictionary性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。开发中需要传递变参,考虑使用 dyna
千家信息网最后更新 2025年11月07日C#怎么比较dynamic和Dictionary性能

C#怎么比较dynamic和Dictionary性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

首先使用以下测试代码:

public void TestDynamic() {     var e = CallDynamic(new { Value = 0 });     int v = e.Value; }  public void TestDictionary() {     var dict = new Dictionary();     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 CallDictionary(     Dictionary test) {     int v = (int)test["Value"];     v++;     var dict = new Dictionary();     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();     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 CallDictionary2(     Dictionary 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();     dict["Value1"] = v1;     dict["Value2"] = v2;     dict["Value3"] = v3;     dict["Value4"] = v4;     dict["Value5"] = v5;     return dict; }

结果数据:

决定选择使用dynamic

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

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

看完上述内容,你们掌握C#怎么比较dynamic和Dictionary性能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

性能 数据 测试 运行 结果 实验 损耗 C# 显著 代码 内容 方法 更多 量级 问题 阶段 选择 束手无策 为此 不大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何取消服务器系统登录密码 吉林省创益网络技术 软件开发经营需要什么资质 数据库ip访问权限 南京瑞特网络技术有限公司 蓝数据库安装 简述公共数据库的主要特征 软件开发好还是土建好 国家鼓励开发网络安全保护 分布式数据库技术特征 普陀区媒体数据库服务商有哪些 南宁市第二届网络安全 三级网络技术是题库原题吗 揭阳ftp服务器找哪家 河南手机软件开发方案 服务器ip和网关可以一样吗 文科两个主要数据库 电脑能作为网页服务器吗 广东税务局上传参数服务器地址 深空之眼版本服务器 苏州dell服务器应用功能 上海项目软件开发服务要多少钱 sql作业在哪个数据库 日越兴餐饮管理系统数据库 st558服务器引导文件设置 工信部第三季度网络安全工作 龙安租房软件开发 医学信息网络技术专业 达梦数据库用户密码设置短密码 cmmi不适合软件开发
0