反射效率低下的原因:
根本原因就是把很多在編譯器能做的工作都推到了運(yùn)行時(shí)來(lái)動(dòng)態(tài)執(zhí)行,jit無(wú)法參與工作,沒辦法運(yùn)用jvm的一些優(yōu)化措施
1.編譯器沒法對(duì)反射相關(guān)的代碼做優(yōu)化
2.慢的原因還有安全檢查,訪問(wèn)控制等。比如說(shuō)這個(gè)方法你能不能獲得准脂,能不能執(zhí)行等豺撑,你傳進(jìn)的參數(shù)的類型檢查等。比如說(shuō)在使用反射調(diào)用方法的時(shí)候栅螟,傳進(jìn)的參數(shù)需要檢查是否符合方法參數(shù)類型要求吧具滴?
a)搜索:使用System.Reflection命名空間中的類型掃描程序集的元數(shù)據(jù)時(shí),反射要不斷的執(zhí)行字符串的搜索堂飞。通常,搜索時(shí)不區(qū)分大小寫的比較绑咱,這會(huì)更進(jìn)一步影響性能绰筛。
b)調(diào)用:使用反射調(diào)用一個(gè)成員時(shí)。比如調(diào)用方法描融,首先必須將實(shí)參打包(pack)成一個(gè)數(shù)組铝噩;在內(nèi)部,反射必須將這些實(shí)參解包(unpack)到線程棧上窿克。此外骏庸,在調(diào)用方法前,CLR必須檢查實(shí)參具有正確的數(shù)據(jù)類型年叮。最后具被,CLR必須確保調(diào)用者有正確的安全權(quán)限來(lái)訪問(wèn)被調(diào)用的成員。
思想:緩存+反射+委托