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<string, object>(); 
  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<string, object> CallDictionary( 
  17.     Dictionary<string, object> test) 
  18.     int v = (int)test["Value"]; 
  19.     v++; 
  20.     var dict = new Dictionary<string, object>(); 
  21.     dict["Value"] = v; 
  22.     return dict; 

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

其中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<string, object>(); 
  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<string, object> CallDictionary2( 
  38.     Dictionary<string, object> 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<string, object>(); 
  50.     dict["Value1"] = v1; 
  51.     dict["Value2"] = v2; 
  52.     dict["Value3"] = v3; 
  53.     dict["Value4"] = v4; 
  54.     dict["Value5"] = v5; 
  55.     return dict; 

结果数据:

最后决定选择使用dynamic

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

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

来源:51CTO

时间: 2025-01-24 06:40:55

C#比较dynamic和Dictionary性能的相关文章

Framework 4.0 新关键字dynamic 之我见(二)

Hi,大家好,随着大家对VS2010的深入了解,对dynamic已经是越来越了解了,何时该用,何时不用已经非常熟悉了,原本不打算再写下去的,但感觉还有点东西需要说说,就简单再说一下吧. 原先以为dynamic实在runtime时确定的,后来看了一下,这个runtime是在微软新出的一个运行时DLR上的,动态的为你判断该使用何种类型,而不是原先的CLR,具体的大家可以参考微软的MSDN,因为英文不太好,以免误导大家,也就不写详细了. 这几天一直在考虑何时去用这个关键字,如果对于一般的程序在没有与其

使用dynamic来简化反射实现,并且提高了性能。

本人转载:http://www.cnblogs.com/cuitsl/archive/2012/01/06/2314636.html 与反射的比较 首先能看到的是,dynamic与反射相比,执行相同操作所需的代码少的多. 如调用类Me中的GetName()方法. class Me {     public string Blog { get; set; }     public string GetName()     {         return"Zhenxing Zhou";

Dictionary&lt;string,object&gt;性能之测试

添加二百万记录时间 16秒 用键查询值的平均时间,0MS 内存使用 150M 代码: /**//* * Created by 邹健 * Date: 2008-2-14 * Time: 10:21 *  *  */namespace test{    using System;    using System.Collections.Generic;    class Program    {        public static void Main(string[] args)       

Swift 性能探索和优化分析

Swift 性能探索和优化分析 本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程语言之名.前两点在 Swift 的语法和语言特性中已经表现得淋漓尽致:像是尾随闭包,枚举关联值,可选值和强制的类型安全等都是 Swift 显而易见的优点.但是对于高效一点,就没有那么明显了.在 2014 年 WWDC 大会上 Apple 宣称 Swift 具有超越 Object

如何确保无线局域网性能优化应

虽然很多无线局域网经理关注于解决问题和避免安全漏洞,但是无线局域网性能优化更注重于任务清单.这个方法不单单考虑不周全,而且忽视优化还是造成灾难的另一个因素.如果每个AP只需要支持十来个用户上网流量,一般的性能可能还是可以接受的,但是当AP接近最大容量而应用程序需求变得更高时,带宽消耗和瓶颈就会变得很严重. 为了实现无线局域网性能优化,网络经理和管理员必须使用新的无线局域网测量和测试工具,它们能够根据网络中运行的应用程序类型来检查网络性能.寻找这些工具会迫使网络管理员寻找目前的供应商以及测试方法之

Dictionary集合

Dictionary<string, string>是一个泛型集合,他本身有集合的功能有时候可以把它看成数组, 他的结构是这样的:Dictionary<[key], [value]>  他的特点是存入对象是需要与[key]值一一对应的存入该泛型,通过某一个一定的[key]去找到对应的值. 直接看代码: using System; using System.Collections.Generic; using System.Text; using System.Linq; names

这下没理由嫌Eval的性能差了吧?

好吧,你偏要说Eval性能差 写ASP.NET中使用Eval是再常见不过的手段了,好像任何一本ASP.NET书里都会描述如何把一个DataTable绑定到一个控件里去,并且通过Eval来取值的用法.不过在目前的DDD(Domain Driven Design)时代,我们操作的所操作的经常是领域模型对象.我们可以把任何一个实现了IEnumerable的对象作为绑定控件的数据源,并且在绑定控件中通过Eval来获取字段的值.如下: protected void Page_Load(object sen

PHP之父:PHP7 性能翻倍关键大揭秘

20岁老牌网页程序语言PHP,最快将在10月底释出PHP 7新版,这是十年来的首次大改版,最大特色是在性能上的大突破,能比前一版PHP 5快上一倍,PHP之父Rasmus Lerdorf表示,甚至能比HHVM虚拟机下的PHP程序性能更快. HHVM 是脸书为自家网站特性而量身客制的PHP优化机制,不见得适用任何网站.但Rasmus Lerdorf表示,新版目标之一就是要让任何网站开发者,就连使用开发框架Drupal.开源电子商务系统Opencart时,都能有不输使用HHVM 技术的性能.在新版发

Java性能的优化(上)(转)

性能|优化 Java在九十年代中期出现以后,在赢得赞叹的同时,也引来了一些批评.赢得的赞叹主要是Java的跨平台的操作性,即所谓的"Write Once,Run Anywhere".但由于Java的性能和运行效率同C相比,仍然有很大的差距,从而引来了很多的批评. 对于服务器端的应用程序,由于不大涉及到界面设计和程序的频繁重启,Java的性能问题看似不大明显,从而一些Java的技术,如JSP,Servlet,EJB等在服务器端编程方面得到了很大的应用,但实际上,Java的性能问题在服务器