Małe kolekcje z biblioteki C5 Generic Collection są stosunkowo bardzo wolne - czy można coś zrobić?

Ostatnio testowałem kolekcje C5 w C # i kocham ich funkcjonalność. W przypadku dużych kolekcji wydajność wydaje się być na równi z odpowiednikami generycznymi. W przypadku małych kolekcji są jednak znacznie wolniejsze. Podejrzewam, że dramatyczne pogorszenie względnej prędkości wynika ze stałych operacji wykonywanych przez kolekcje C5. Jedną operacją, jaką znam, jest strzelanie do wydarzeń. Czy może to być przyczyną słabej wydajności małych kolekcji? Czy można temu zaradzić, wyłączając niektóre funkcje? Oto test wydajności:

//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);

a klasa Test:

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);
    } 
}

Dane wyjściowe to:

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

Zarówno C5, jak i test to wersje Release. Stosunek prędkości około 60x do wstawiania i 6x do sortowania jest zgodny między przebiegami testowymi.

EDYCJA: Powyższy test został uruchomiony z poziomu VS. Wyniki pracy poza VS to:

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

Ponownie, stosunek prędkości około 100x do wstawiania i 2x do sortowania jest zgodny między przebiegami testu.

Mój projekt obejmuje wiele manipulacji małymi pojemnikami, a ich wydajność jest najważniejsza. Funkcjonalność kontenerów C5 jest świetna i bardzo chciałbym z nich korzystać, ale w tej chwili nie mogę z powodów wydajnościowych. Doceniłbym każdy wgląd w tę sprawę.

EDIT2: Zgodnie z odpowiedzią Iridium, wykonałem test w pętli (umieszczając całą logikę zawierającą tworzenie kontenera w pętli, tak aby wykluczyć wszelkie sztuczki optymalizacyjne kompilatora), odrzuciłem dwa pierwsze wyniki i uśredniłem kolejne 1000 wyników. Tutaj są:

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

Teraz wstawianie C5 jest o 76% wolniejsze i sortowanie jest na równi z listą. To wystarczy dla mojego celu. Przyjmuję odpowiedź Iridium. Jeśli jednak ktoś ma wgląd w wolniejsze wstawianie, podziel się nim. Dziękuję wszystkim za pomoc.

questionAnswers(1)

yourAnswerToTheQuestion