zoukankan      html  css  js  c++  java
  • 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次 时间
    结果:

    640?wx_fmt=png

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

    结果数据:

    640?wx_fmt=png

    最后决定选择使用dynamic

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

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

  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12352382.html
Copyright © 2011-2022 走看看