来自C5 Generic Collection Library的小型集合相对来说非常慢 – 可以做任何事情吗?

我最近一直在用C#测试C5系列,我很喜欢它们的function。 对于大型馆藏,性能似乎与通用同行相当。 对于小型集合,它们明显较慢。 我怀疑相对速度的急剧恶化来自于C5系列的恒定时间操作。 我所知道的一个操作是触发事件。 这可能是小型collections品表现不佳的原因吗? 可以通过关闭某些function来解决这个问题吗? 这是’性能测试:

//Two containers to be tested. 'Test' is a wrapper over decimal. var arrayList = new C5.ArrayList(); var genericList = new System.Collections.Generic.List(); var toBeAdded = new List(); var watch = new Stopwatch(); //Fill both tested containers for (int i = 10; i > 0; i--) { var test = new Test(i); genericList.Add(test); arrayList.Add(test); } //Fill the container the range of which will be inserted to the tested containers for (int i = 5; i > 0; i--) { toBeAdded.Add(new Test(i+0.5m)); } //Test the speed of adding a range of values and sorting for both containers watch.Start(); genericList.AddRange(toBeAdded); Console.WriteLine("Adding values for generic list: {0} ticks", watch.ElapsedTicks); watch.Restart(); genericList.Sort(); Console.WriteLine("Sorting for generic list: {0} ticks", watch.ElapsedTicks); watch.Restart(); arrayList.AddAll(toBeAdded); Console.WriteLine("Adding values for C5 ArrayList: {0} ticks", watch.ElapsedTicks); watch.Restart(); arrayList.Sort(); Console.WriteLine("Sorting for C5 ArrayList: {0} ticks", watch.ElapsedTicks); 

和测试类:

 class Test : IComparable { private decimal _number; internal Test(decimal aNumber) { _number = aNumber; } public int CompareTo(object obj) { var test = (Test) obj; return _number.CompareTo(test._number); } } 

输出是:

 Adding values for generic list: 56 ticks Sorting for generic list: 770 ticks Adding values for C5 ArrayList: 3575 ticks Sorting for C5 ArrayList: 4815 ticks 

C5和测试都是Release版本。 在测试运行之间,插入速度约为60x,排序速度约为6x。

编辑:上面的测试是从VS内部运行的。 在VS之外运行的结果是:

 Adding values for generic list: 54 ticks Sorting for generic list: 2135 ticks Adding values for C5 ArrayList: 5765 ticks Sorting for C5 ArrayList: 5198 ticks 

同样,在测试运行之间,插入速度约为100x,排序速度约为2x。

我的项目包括大量操作小容器,它们的性能至关重要。 C5容器的function很棒,我很乐意使用它们,但目前不能出于性能原因。 我很欣赏有关此事的任何见解。

EDIT2:根据Iridium的回答,我在循环中执行了测试(将包含容器创建的整个逻辑放入循环中以排除任何编译器优化技巧),丢弃前两个结果并平均后续1000个结果。 他们来了:

 Adding values for generic list: 1.09 ticks Sorting for generic list: 14.07 ticks Adding values for C5 ArrayList: 1.92 ticks Sorting for C5 ArrayList: 13.69 ticks 

现在C5插入速度慢了76%,排序与List相同。 这对我的目的来说已经足够了。 我接受了铱星的回答。 不过,如果有人对插入速度较慢有任何见解,请分享。 谢谢大家的帮助。

我想知道你的结果是否有点误导,并且由于第一次使用add / sort方法时assembly加载/ JIT编译的开销,实际上(可能)你看到的C5差异。 由于系统组件已经加载/ NGen,因此通用集合没有遭受这种情况。

我使用C5 2.1.4596.30350重复测试,但多次运行整个测试(不重新启动应用程序以避免任何一次性开销)。 结果似乎表明,首次使用C5集合会产生时间损失(与JIT编译之类的一次性开销一致),在后续使用中消失,使C5性能与通用集合的性能有效。

通用与C5的图表在重复运行时添加和排序]