InvokeMember очень медленный, в любом случае, чтобы избежать этого? - PullRequest
1 голос
/ 18 октября 2010

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

Этот фрагмент занимает около 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);
    }
}

Ответы [ 3 ]

3 голосов
/ 18 октября 2010

Посмотрите на Fasterflect - API быстрого и простого отражения и Fast Invoker они готовы к использованию решений и интересны для изучения.

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

3 голосов
/ 18 октября 2010

Я предполагаю, что 15 с используется в цикле;отражение не , что медленно.

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

Обратите внимание, что нетипизированный вызов делегата выполняется медленно;это должно быть напечатано.Также;вы можете быть хитрым и использовать делегата с дополнительным (ведущим) параметром, чтобы вызывать метод instance для диапазона различных объектов, если вам нужно изменить целевой объект для каждого вызова.

Для более сложных сценариев полезны Expression или DynamicMethod.

1 голос
/ 18 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...