2010-11-11 1 views
4

Я работаю с каркасом, который использует коллекции, полученные от System.Collections.CollectionBase. Пользователи жалуются на производительность, и я чувствую, что эти коллекции, которые очень сильно используются, могут быть большой частью проблемы. Есть ли способ с инструментом или профилировщиком или в IL, чтобы я мог получить некоторые показатели при штрафах на бокс/unboxing? Мне нужны доказательства для резервного копирования на System.Collections.Generic. Я пробовал CLRProfiler, но, как правило, теряюсь и не уверен, что я должен искать.Есть ли способ для измерения штрафов за бокс/unboxing?

ОБНОВЛЕНИЕ
Спасибо всем за ваш вклад. Я знаю, что это, вероятно, не главное узкое место, но я ищу метрики как можно большего числа возможных убийц производительности. Это всего лишь один из них, не уверенный, насколько он велик, поэтому ищет способ его измерить.

+0

Я очень уверен, что проблема с производительностью не будет тем классом, который вы используете. Прочтите несколько руководств по профилированию и протестируйте их. Вы также можете взять методы своего кода и выполнить их самостоятельно, чтобы проверить, сколько времени они берут за 1,10,100,100000 элементов и проверить, действительно ли это имеет значение. – dbemerlin

+0

Лично я сомневаюсь, что это узкое место; в частности, это структуры или классы в коллекции? –

+0

Классы. Многие из них. Используется очень сильно. Я знаю о других проблемах с фреймворком (есть много и много проблем), но я пытаюсь собрать как можно больше показателей, чтобы убедить их обновиться. –

ответ

10

Хотя я, безусловно, рекомендую вам перейти от не общих к родовым коллекциям по множеству веских причин, я, честно говоря, сомневаюсь, что эти коллекции могут стать причиной ваших проблем с производительностью. Бокс, как правило, является лишь проблемой, когда вы добираетесь до микроскопического уровня, требуя выжать крошечные выгоды в ситуациях с высокой производительностью. Также полезно избегать в целом по причинам GC, но, как правило, это незначительно и на этой арене.

Говоря иначе: это весьма сомнительно, что бокса может вызвать проблемы с производительностью, что ваши пользователи заметят.

Очевидно, что я говорю в обобщениях. Не зная вашего конкретного сценария, я не могу сказать так много с уверенностью.


Edit: Обратите внимание, что в то время как я скептически ваша проблема может быть ваше использование необщих коллекций сами по себе, я укажу, что является очень важно, что типа коллекции вы используете для решения данной проблемы, особенно когда количество данных в коллекции велико. Вот лишь несколько примеров:

  • Если вы выполняете Lookups на основе ключа, хэш-таблицы, такие как Dictionary<TKey, TValue> будет значительно превзойти List<T>, например.
  • Если вы проверяете дубликаты, то HashSet<T> будет иметь превосходную производительность.
  • Если вы ищете FIFO (поведение в очереди), то Queue<T> будет иметь превосходную производительность.
  • Если вы выполняете вставки/абстракции в случайных положениях в коллекции, то LinkedList<T> будет иметь превосходную производительность.

Эти коллекции должны быть частью любого набора инструментов разработчика .NET (действительно, любого разработчика). Если вы обнаружите, что используете List<T> (или ArrayList) или подобную структуру данных везде, где вы используете коллекции предметов, это очень хорошо может вызвать проблему производительности в будущем - опять же, особенно когда ваши коллекции большие. Я не говорю о тривиальных показателях производительности. Так что будьте осторожны, чтобы сделать разумные выборы для вашей коллекции типа.


Но я бы рекомендовал профайлер производительности в целом, такие как ANTS (хорошо, но не бесплатно) или EQATEC (также хорошо и бесплатно). Просто запустите приложение в рамках программы, такой как один из них, и посмотрите, где ваши узкие места. Я предполагаю, что вы обнаружите, что это не ваши не общие коллекции; но, естественно, я мог ошибаться.

+0

Правильно ... вероятность того, что производительность, над которой используется коллекция, является незначительной по сравнению с другими областями, такими как доступ к данным или задержка в сети. – Josh

+0

Играя с EQATEC сейчас. Большое спасибо за ваш подробный ответ. –

+1

OMG @ Dan Tao, я бы это сделал, если бы мог. Использовал EQATEC, чтобы найти дымящийся пистолет, и вы были правы, это не имеет никакого отношения к боксу и всему, что связано с доступом к данным. Спасибо Спасибо спасибо. –

2

Почему бы просто не настроить быстрое консольное приложение для измерения скорости различных операций. Вы можете использовать простой метод, как это:

private TimeSpan TimedAction(Action action) 
{ 
    var timer = new Stopwatch(); 

    timer.Start(); 

    action.Invoke(); 

    timer.Stop(); 

    return timer.Elapsed; 
} 

И называть это так:

var elapsed = TimedAction(() => 
    { 
     //Do some stuff with your collection here 
    }); 

Console.WriteLine("Elapsed Time: {0}", elapsed.TotalMilliseconds); 

Вы должны быть в состоянии собрать достаточно эмпирических данных, от этого, чтобы выяснить, какой набор будет быстрее дано аналогичное операции. Количество позиций, количество выполненных смежных операций и т. Д.

Однако, as Dan, упомянутый выше; сумма общей производительности, затрачиваемой на коллекцию третьей стороны, вероятно, незначительна, когда сопоставляется доступ к данным и латентность сети.

1

Вот доказательство, в котором вы нуждаетесь.

От MSDN:

В дополнении к типу безопасности, общие типов коллекций обычно выполняет лучше для хранения и манипулирования типов значений, потому что нет никакой необходимости боксировать типы значений.

Обратите внимание, что в реальной жизни дженерики на самом деле не так быстро, как говорит Microsoft. Разница незначительна.

1

@ Замечания Дана Тао прямо на деньги.

Что я нахожу, что занимаюсь много, в аналогичных обстоятельствах, это this technique, что вы можете сделать под любой IDE.

Итак, я знаю, что вы хотите измерить определенную вещь, но в целом ваша большая проблема заключается в поиске проблем с производительностью, где бы они ни находились, не так ли?

У нас есть дебаты по таким вопросам, но что такое программа действительно тратить время на это не связано с этим. Такие вещи, как переход на 30 слоев глубоко в подземные библиотеки, просто для того, чтобы делать такие вещи, как извлечение строк из ресурсов, чтобы их можно было перевести на разные языки, когда они этого не делают, по сути, должны быть. Такие вещи, как кто-то, устанавливают свойство True, которое выделяет цепочку уведомлений с добавлением или удалением элементов из списков, обновляемыми элементами управления деревом, создаваемыми и уничтожаемыми окнами, добавлением/удалением вкладок и пунктов меню и т. Д. Затем немного позже, свойство снова получает значение False, как будто это не имеет большого значения. Такие вещи, как установка ячеек в режиме управления сеткой, где возникает подобная волна приливов. Вообще, хвосты вилят собаки.

Это то, что я имею в виду, что такое действительно Продолжение. Когда такие вещи, как бокс, являются проблемой, образцы покажут это.

Смежные вопросы