#c# #optimization #delegates #lambda
#c# #оптимизация #делегаты #лямбда
Вопрос:
Я использую несколько функций, таких как
ICollection<ICache> caches = new HashSet<ICache>();
ICollection<T> Matches<T>(string dependentVariableName)
{
return caches
.Where(x => x.GetVariableName() == dependentVariableName)
.Where(x => typeof(T).IsAssignableFrom(x.GetType()))
.Select(x => (T) x)
.ToList();
}
в моем текущем классе design. Они прекрасно работают с точки зрения архитектуры — где я могу произвольно добавлять объекты различных связанных типов (в данном случае ICaches) и извлекать их как коллекции конкретных типов.
Проблема в том, что фреймворк здесь представляет собой научный пакет, и такого рода функции лежат на очень горячих путях кода, которые вызываются тысячи раз в течение нескольких минут. Результат:
и функции, подобные описанным выше, являются основными потребителями COMDelegate::DelegateConstruct .
Как вы можете видеть из относительного распределения выборки%, это не нарушает условия сделки, но было бы здорово немного сократить накладные расходы!
Заранее благодарю.
Ответ №1:
1) я не понимаю, как опубликованный вами код связан с данными о производительности … перечисленные функции вообще не выглядят так, как будто они вызываются из этого кода. так что на самом деле я не могу ответить на ваш вопрос, кроме как сказать, что, возможно, вы неправильно интерпретируете отчет о производительности.
2) не вызывать .Список в конце… просто верните IEnumerable . это повысит производительность. делайте ToList только тогда, когда вам действительно нужен список, в который вы можете позже добавлять / удалять / сортировать вещи.
3) у меня недостаточно контекста, но, похоже, этот метод можно устранить, используя dynamic
ключевое слово
Комментарии:
1. Итак, # 2 я могу изменить сразу (спасибо). R / E # 1, я знаю, что это выражение LINQ связано с вызовом DelegateConstruct из-за функциональности «Эта функция вызывается …» в отчетах о производительности (не говоря уже о том, что эта строка помечается как «путь к горячему коду»). Я смотрю на это: msmvps.com/blogs/jon_skeet/archive/2011/08/23 / … и интересно, связана ли моя проблема с использованием общего аргумента в лямбда-выражении? Я бы подумал, что IsAssignableFrom будет кэшироваться?
2. Кроме того, если вы хотите удалить код, он находится здесь, на github: github.com/JLospinoso/sie/blob/master/SienaDotNet/Modeling /…