我进行了两个测试。
1- 添加10万个元素需要多长时间。
2- 在10秒钟内使用10万个元素可以进行多少次搜索。
我的测试结果如下:
ExpandoObject添加计数器为97075。
Dictionary添加计数器为35。
ExpandoObject搜索计数器为2396。
Dictionary搜索计数器为1957637。
结论:
添加ExpandoObject元素比添加Dictionary元素慢2773倍。
搜索ExpandoObject元素比搜索Dictionary元素慢817倍。
为什么ExpandoObject比Dictionary慢得多?
using System;
using System.Dynamic;
using System.Collections.Generic;
using System.Threading;
namespace c_sharp_benchmark
{
class Program
{
static void Main(string[] args)
{
BenchmarkExpandoObjectAdd();
BenchmarkDictionaryAdd();
BenchmarkExpandoObjectSearch();
BenchmarkDictionarySearch();
}
static void BenchmarkExpandoObjectAdd()
{
dynamic exp = new ExpandoObject();
var expid = (IDictionary<string, object>)exp;
Random rnd = new Random();
long old = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
int i;
for (i = 0; i < 100000; i++)
{
expid.Add("Prop" + i, i);
}
Console.WriteLine("ExpandoObject Add counter " + (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - old));
}
static void BenchmarkDictionaryAdd()
{
Dictionary<string, object> dic = new Dictionary<string, object>();
Random rnd = new Random();
long old = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
int i;
for (i = 0; i < 100000; i++)
{
dic.Add("Prop" + i, i);
}
Console.WriteLine("Dictionary Add counter " + (DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - old));
}
static void BenchmarkExpandoObjectSearch()
{
dynamic exp = new ExpandoObject();
var expid = (IDictionary<string, object>)exp;
Random rnd = new Random();
int i;
for (i = 0; i < 100000; i++)
{
expid.Add("Prop" + i, i);
}
int auxval;
long when_stop = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + 10000;
int counter = 0;
while (when_stop > DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())
{
++counter;
auxval = (int)expid["Prop" + rnd.Next(100000)];
}
Console.WriteLine("ExpandoObject Search counter " + counter / 10);
}
static void BenchmarkDictionarySearch()
{
Dictionary<string, object> dic = new Dictionary<string, object>();
Random rnd = new Random();
int i;
for (i = 0; i < 100000; i++)
{
dic.Add("Prop" + i, i);
}
int auxval;
long when_stop = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() + 10000;
int counter = 0;
while (when_stop > DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())
{
++counter;
auxval = (int)dic["Prop" + rnd.Next(100000)];
}
Console.WriteLine("Dictionary Search counter " + counter / 10);
}
}
}
Stopwatch
来进行精确和准确的性能计时,而不是使用DateTimeOffset.UtcNow
。请参阅性能测试的精确时间测量。 - dbc