c # COMDelegate::оптимизация DelegateConstruct

#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 /…