Воокумабем очень медленно, в любом случае, чтобы избежать этого?

StackOverflow https://stackoverflow.com/questions/3962066

Вопрос

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

Этот фрагмент занимает около 15 секунд, чтобы завершить слишком медленно, но видит, как мне нужно прочитать метаданные.

private static object InvokeCall(Type HostObjectType, Object HostObject, CallType callType, string PropertyOrMethodName, object[] args)
{
    if (callType == CallType.Method)
    {
        return MyObjectType.InvokeMember(PropertyOrMethodName,System.Reflection.BindingFlags.InvokeMethod, null, myObject, args);
    }
}
Это было полезно?

Решение

Я предполагаю, что 15s - это при использовании в петле; Отражение не это медленный.

Вы можете ускорить размышления (и в частности, вызывать), получив методинфо и используя делегат. CreateDelegate однажды. Отказ Затем вы кэшируете и повторно используете в результате набранный делегат (соответствие ожидаемой подписи вызова). Затем используйте напечатанный делегат.

ПРИМЕЧАНИЕ. Note Untyped делегат вызывает медленный; Это должно быть набрано. Также; Вы можете подлыми и использовать делегат с дополнительным (ведущим) параметром, чтобы вызвать пример Метод против диапазона различных объектов, если вам нужен целевой объект для изменения за вызов.

Для более сложных сценариев полезны выражение или динамическое значение.

Другие советы

Посмотрите на Вестефлект - быстрое и простое отражение API а также Быстрый invoker Они готовы использовать решения и интересные для изучения.

Если вы хотите пойти по собственным способом Проверьте статьи: Уклоняйтесь от общей производительности подводными камнями для ремесленного быстрого применения а также Динамически скомпилированные лямбдас против чистого отражения

Попробуйте использовать дерево выражения скомпилированное лямбда и кэш лямбда. Я широко использовал это с большим успехом.

http://kohari.org/2009/03/06/fast-late-bound-invocation-with-expression-trees/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top