当前位置: 首页 > 科技观察

C#dynamic和Dictionary性能对比

时间:2023-03-11 23:58:12 科技观察

开发时需要传递可变参数,考虑是用dynamic还是Dictionary(准确的说是Dictionary)。dynamic的编码体验明显优于Dictionary。如果性能差距不大,我会选择使用dynamic。查找后没有找到类似的对比数据,于是决定自己试验。首先使用下面的测试代码:"]=0;dict=CallDictionary(dict);intv=(int)dict["Value"];}privatedynamicCallDynamic(dynamictest){intv=test.Value;v++;returnnew{Value=v};}privateDictionaryCallDictionary(Dictionarytest){intv=(int)test["Value"];v++;vardict=newDictionary();dict["Value"]=v;returndict;}分别比较Run1次、10次、100次、1000次、1e4次、1e5次、1e6次的结果:dynamic一栏和dynamic2一栏的数据分别是:一步测试执行一次运行和连续执行一次运行所有测试对测试过程和数据进行测试分析,得到以下结论:1.使用动态***会造成一定的性能损失2.不管是否使用***,使用次数达到一定程度,而且dynamic的性能肯定比Dictionary3要好。在一次运行中连续使用dynamic会显着降低平均性能损失。考虑到传递可变参数时可能有多个参数,所以上面的测试并不完整。使用以下代码进行第二阶段实验:publicvoidInvokeDynamic(){vare=CallDynamic2(new{Value1=0,Value2=0L,Value3=0f,Value4=0.0,Value5="test"});intv1=e.Value1;longv2=e.Value2;floatv3=e.Value3;doublev4=e.Value4;stringv5=e.Value5;}publicvoidInvokeDictionary(){vardict=newDictionary();dict["Value1"]=0;dict["Value2"]=0L;dict["Value3"]=0f;dict["Value4"]=0.0;dict["Value5"]="test";dict=CallDictionary2(dict);intv1=(int)dict["Value1"];longv2=(long)dict["Value2"];floatv3=(float)dict["Value3"];doublev4=(double)dict["Value4"];stringv5=(string)dict["Value5"];}privatedynamicCallDynamic2(dynamictest){intv1=test.Value1;longv2=test.Value2;floatv3=test.Value3;doublev4=test.Value4;stringv5=test.Value5;v1++;v2++;v3++;v4++;v5+="test";returnnew{Value1=v1,Value2=v2,Value3=v3,Value4=v4,Value5=v5};}privateDictionaryCallDictionary2(字典test){intv1=(int)test["Value1"];longv2=(long)test["Value2"];floatv3=(float)test["Value3"];doublev4=(double)test["Value4"];stringv5=(string)test["Value5"];v1++;v2++;v3++;v4++;v5+="test";vardict=newDictionary();dict["Value1"]=v1;dict["Value2"]=v2;dict["Value3"]=v3;dict["Value4"]=v4;dict["Value5"]=v5;returndict;}结果数据:***决定使用动态。有兄弟考虑可能是Box性能损失,Dictionary性能不好。他们做了一个第三阶段的实验,比较dynamic和Dictionary的具体数据。次