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量级快一倍

  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12352383.html
Copyright © 2011-2022 走看看