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

我最近一直在用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和测试都是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容器的功能很棒,我很乐意使用它们,但目前还不能出于性能原因.我很欣赏有关此事的任何见解.

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方法时装配加载/ JIT编译的开销,实际上(可能)你看到的C5差异.由于系统组件已经加载/ NGen,因此通用集合没有遭受这种情况.

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

上一篇:Excel中的条件汇总函数,看过这些你就懂


下一篇:[C5]机器学习诊断