Недавно я тестировал коллекции C5 на C #, и мне очень нравится их функциональность. Для больших коллекций производительность кажется на уровне обычных аналогов. Однако для небольших коллекций они значительно медленнее. Я подозреваю, что резкое ухудшение относительной скорости происходит из-за операций с постоянным временем, выполняемых коллекциями 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);
и класс 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);
}
}
Результат:
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. Этого достаточно для моей цели. Я принимаю ответ Иридиум. Тем не менее, если у кого-то есть какие-либо сведения о более медленной установке, поделитесь, пожалуйста. Спасибо всем за помощь.
ArrayList
в декомпиляторе, я мог бы подумать, что ответ - нет, вы не можете улучшить производительность. C5 имеет более многоуровневый подход по сравнению с обычнымList
, и, очевидно, это имеет свою цену с точки зрения производительности. - person Martin Liversage   schedule 03.10.2012