2013-12-10 3 views
0

Я читаю «Отражение», и, похоже, это хорошо подходит для моего приложения, но у меня есть некоторые проблемы, в основном вокруг производительности. Вот мой класс ниже. MyObject может создаваться 20 раз на запрос страницы, что означает, что CreateInstance будет выполняться только около 20 раз на страницу, макс. Вопрос 1: Могу ли я быть доволен этим тем, что это не влияет на производительность таким значительным образом?Использование Reflection в .net 4.0 для запуска функции несколько раз

Моя основная забота заключается в том, что RunFunction можно назвать 100-кратным запросом на страницу. Итак, вопрос 2: будет ли это ухудшать производительность и есть ли лучший способ сделать это, если это произойдет?

Мое приложение знает обо всех классах, названных в имени SomeClassName, но просто не знает WHEN, чтобы выполнять функции objDynamic до выполнения.

Вопрос 3: У них были значительные улучшения в .net 4.0 для производительности отражения?

Спасибо за ваше время.

Class MyObject 
    dim objDynamic as object = nothing 
    public sub new(SomeClassName as String) 
     objDynamic = Activator.CreateInstance(Type.[GetType](SomeClassName)) 
    end sub 

Public function RunFunction(strFunctionName As String) As Object 
    Dim thisType As Type = objDynamic.[GetType]() 

    Dim theMethod As System.Reflection.MethodInfo = thisType.GetMethod(strFunctionName) 

    dim objResult as Object = theMethod.Invoke(objDynamic, nothing) 

return objResult 
End Function 

end class 

Edit: Что делать, если я сделал это ...

Class MyObject 
    dim objDynamic as object = nothing 
    Public bolMethodInfo As New List(Of System.Reflection.MethodInfo) 
    public sub new(SomeClassName as String) 
     objDynamic = Activator.CreateInstance(Type.[GetType](SomeClassName)) 
    end sub 

Public function RunFunction(strFunctionName As String) As Object 
    Dim thisType As Type = objDynamic.[GetType]() 

    Dim theMethod As System.Reflection.MethodInfo = Nothing 
    For Each mi As System.Reflection.MethodInfo In bolMethodInfo 
     If mi.Name = strFunctionName Then 
      theMethod = mi 
      Exit For 
     End If 
    Next 

    If theMethod Is Nothing Then 
     theMethod = thisType.GetMethod(strFunctionName) 
     bolMethodInfo.Add(theMethod) 
    End If 

    dim objResult as Object = theMethod.Invoke(objDynamic, nothing) 

return objResult 
End Function 

end class 
+1

Откуда берутся названия типов и функций? Можете ли вы изменить свой подход, чтобы вам не приходилось полагаться на отражение при запуске приложения? Например. сохраняйте отображение из строки делегатам, которые создают ваш объект и запускают функцию. – fsimonazzi

+0

В моем приложении блок разметки XML загружен и встроен в это имя имени типа и функции, которое должно выполняться (возможно, сотни раз). Я не уверен, как сопоставить строку с делегатом и запустить функцию и т. Д., Которая заменит мой код выше. – Mike

+0

Итак, я добавил еще один фрагмент кода. Если это поиск метода MethodInfo, который занимает больше всего времени, могу ли я не просто хранить его локально. Если он запускается сто раз на страницу, то он получает MethodInfo один раз и только извлекает его из bolMethodInfo, если он эффективно использует его еще 99 раз? См. Отредактированный код. – Mike

ответ

1

This (второй ответ) предлагает способ использовать отражение и прорезать затрат.

0

Early optimization is the root of all evil. Попробуйте профилировать ваше приложение и посмотрите, пытаетесь ли вы оптимизировать правильную часть кода. Выполнение чего-то 20 раз обычно не много, 200000 раз. Зависит от случая, конечно, так сначала профиль, а потом решайте. Да, переход на Reflection может быть быстрее, до 10 раз, если сделать правильно, IIRC. Но кошмар содержания, который он вызывает, не стоит (в большинстве случаев).

+0

Я могу оценить это, потому что, если вы оптимизировали идеально, ни один проект никогда не закончится, однако, когда есть фундаментальный недостаток в том, как вы это делаете, возникает проблема. Могу ли я предположить, что из того, что вы прочитали до сих пор, этот подход не является фундаментальным недостатком, а вполне приемлемым подходом? – Mike

+0

@Mike: Да, отражение приемлемо, но его следует рассматривать только как последнее средство, если вы не смогли бы его обработать с помощью других методов. – Neolisk

+0

@Mike: Что я имею в виду - если ваш исходный код A) должен быть оптимизирован (сложный профиль, прежде чем вы решите) B) можно оптимизировать, удалив отражение от него, а затем сделайте это. Если A все еще применяется, а B - нет, вы можете кэшировать свои обратные вызовы. Просто убедитесь, что применяется А. – Neolisk

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