我最近一直在用 C# 测试 C5 集合,我很喜欢它们的功能。对于大型集合,性能似乎与通用对应物相当。但是,对于小型集合,它们的速度要慢得多。我怀疑相对速度的急剧下降来自 C5 集合执行的恒定时间操作。我知道的一项操作是触发事件。这可能是小型集合性能不佳的原因吗?可以通过关闭某些功能来解决这个问题吗?这是性能测试:
//Two containers to be tested. 'Test' is a wrapper over decimal.
var arrayList = new C5.ArrayList<Test>();
var genericList = new System.Collections.Generic.List<Test>();
var toBeAdded = new List<Test>();
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 和测试都是发布版本。大约 60 倍的插入速度和 6 倍的排序速度在测试运行之间的比率是一致的。
编辑:上述测试是从 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
同样,插入速度约为 100 倍,排序速度约为 2 倍,这在测试运行之间是一致的。
我的项目包括很多小容器的操作,它们的性能是最重要的。C5 容器的功能很棒,我很想使用它们,但目前由于性能原因不能使用。我将不胜感激对此事的任何见解。
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 的排序相当。这对我的目的来说已经足够了。我接受铱星的回答。不过,如果有人对较慢的插入有任何见解,请分享。谢谢大家的帮助。