Did you know what the performance impact of using the ExpandoObject is?
Here is a quick performance test generating an array of 2’000’000 items which have exactly one integer property “Index” and then calculate the average of that integer.
Any other ideas?
Here is a quick performance test generating an array of 2’000’000 items which have exactly one integer property “Index” and then calculate the average of that integer.
void Main() { var count = 2000000; var dicos = GetDictionaries(count).ToArray(); var dicoAvg = dicos.Average(i => (int)i["Index"]);
var expandos = GetExpandoObjects(count).ToArray(); var expandoAvg = expandos.Average(i => i.Index);
var anos = (from index in Enumerable.Range(1,count) select new { Index = index}).ToArray(); var anosAvg = anos.Average(i => i.Index);
var objects = GetObjects(count).ToArray();
var objectAvg = objects.Average(i => (int)i[0]);
} IEnumerable<IDictionary> GetDictionaries(int count) { return from index in Enumerable.Range(1,count) select new Dictionary<string, object>() { {"Index", index} }; } IEnumerable<dynamic> GetExpandoObjects(int count) { foreach(var index in Enumerable.Range(1,count)) { dynamic obj = new ExpandoObject(); obj.Index = index; yield return obj; } }
No surprise, the anonymous type is the fasted followed by the object array. Both, the ExpandoObject and the Dictionary must store a Key/Value pair internally and do a key lookup to return the requested “Index” value for the averaging function. Which structure should you use? I guess the answer depends on the degree of flexibility you need, but consider the performance impact.IEnumerable<object[]> GetObjects(int count) { return from index in Enumerable.Range(1,count) select new object[] {index}; }
Structure
|
ToArray()
|
Average
|
Dictionary
|
3069ms
|
179ms
|
ExpandoObject
|
2757ms
|
125ms
|
Object array
|
1215ms
|
37ms
|
Anonymous type
|
421ms
|
33ms
|
Any other ideas?