在.net 4.0中使用Reflection来多次运行一个函数

时间:2013-12-10 15:00:28

标签: .net vb.net performance reflection

我一直在阅读Reflection,它似乎非常适合我的应用程序,但我有一些担忧,主要是关于性能。这是我下面的课程。每页请求可能会创建20次MyObject,这意味着CreateInstance每页最多只执行20次,最多。问题1:我能否对此感到满意,因为这不会以如此显着的方式影响性能?

我主要担心的是每个页面请求可能会调用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

编辑:如果我这样做会怎么样......

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

2 个答案:

答案 0 :(得分:1)

This(第二个答案)提出了一种使用反思和削减成本的方法。

答案 1 :(得分:0)

Early optimization is the root of all evil。尝试分析您的应用程序,看看您是否正在尝试优化正确的代码。执行20次通常不是很多,20万次。当然,取决于案例,首先是个人资料,然后再决定。是的,如果做得好,转换到Reflection可以更快,最多10次,IIRC。但它造成的维护噩梦并不值得(大部分时间)。