C5 通用集合库中的小型集合相对来说非常慢 - 有什么办法吗?

2024-03-05

我最近一直在 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 相当。这对于我的目的来说已经足够了。我接受铱星的回答。不过,如果有人对插入速度较慢有任何见解,请分享。感谢大家的帮助。


我想知道您的结果是否有点误导,并且您在 C5 中看到的差异实际上(可能)是由于首次使用 add/sort 方法时程序集加载/JIT 编译的开销造成的。由于系统程序集已被加载/NGen'ed,通用集合不会受到此影响。

我使用 C5 2.1.4596.30350 重复了您的测试,但多次运行整个测试(无需重新启动应用程序,以避免任何一次性开销)。结果似乎表明,首次使用 C5 集合时存在时间损失(与 JIT 编译等一次性开销一致),该时间损失在后续使用中消失,使 C5 性能实际上与通用集合的性能相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C5 通用集合库中的小型集合相对来说非常慢 - 有什么办法吗? 的相关文章

随机推荐