从C5通用收集库小型集合相对很慢 - 什么可以做什么?(Small sized collection

2019-08-01 03:12发布

我最近一直在测试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和测试的发布版本。 的周围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

再次,大约100倍的速度插入和2x用于排序的比率是测试运行之间是一致的。

我的项目包括了很多小的容器操纵的,其性能是至关重要的。 C5容器的功能是伟大的,我喜欢使用它们,但目前不能为性能的原因。 我会很感激对此事的任何见解。

EDIT2:按铱的答案,我在一个循环中执行的测试(使整个逻辑包括容器创建到环路以便排除任何编译器优化技巧),弃去前两个结果和随后的平均值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%和排序是看齐该列表。 这对我来说已经足够了。 我接受铱的答案。 不过,如果任何人有慢插入任何见解,请与大家共享。 感谢所有帮助。

Answer 1:

我在这里想知道如果你的结果是有点误导,那你看到了C5的差异实际上是(可能)由于集加载/ JIT编译的第一次使用,加/排序方法的开销。 通用集合无法从这种痛苦为已经被已经加载/ NGen'ed系统组件的结果。

我重复使用C5 2.1.4596.30350您的测试,但整个多次测试运行(无需重新启动应用程序,以避免任何一次性费用)。 结果似乎表明,存在对以后的使用中消失,留下C5性能有效相同的泛型集合的第一次使用C5集合(用一次性开销像JIT编译一致)的时间损失。



文章来源: Small sized collections from C5 Generic Collection Library are comparatively very slow - can anything be done?