我正面臨一點困境。動態轉換vs反射調用:選擇哪種毒藥?
我需要重複調用某個類型的許多實例上的給定方法,這些實例可能存在也可能不存在。因爲對於任何給定的實例,該方法的結果永遠不會改變,所以我將緩存它的返回值以供將來使用,以便在隨後的調用中儘早減少開銷並返回,但仍然是實際上需要調用該方法的那部分方法方法 - 即五月 - 不存在:
var method = Context.Parent.GetType().GetMethod("typeHint");
if (method == null)
{
token = null;
_hasTypeHint = false;
return false;
}
var hint = ((dynamic)Context.Parent).typeHint() as VBAParser.TypeHintContext;
token = hint == null ? null : hint.GetText();
return hint != null;
捕獲/處理一個RuntimeBinderException
是一個重大的性能瓶頸,所以我決定,以反映對有問題的類型去發現之前調用該方法是否存在它。
Context.Parent
的具體類型在編譯時是未知的,並且可能的運行時類型不共享一個公共接口,該接口將使用我正在尋找的typeHint()
方法:我需要調用反射成員,或者投到dynamic
並直接調用它。
我的提交消息是這樣的:
通過反映上下文類型來定位使用的方法除去的可能性爲RuntimeBinderException。 保留(動態)投射,因爲視爲比反射調用更便宜..雖然可能是錯誤的。
哪一個招致的開銷最少,更重要的是爲什麼?
爲什麼開銷會讓你擔心嗎?你是否在緊密的循環中多次調用這個方法? – dasblinkenlight
@dasblinkenlight我正在迭代(至少)數百個實例(取決於數據)的類型,所以耶非常。剖析它就像在大海撈針中找到針一樣。 –
當我面對這些類型的問題時,我立即開始考慮異步技術。我知道使用反射很昂貴,但如果你需要分離多少線程,可能不是那麼多,對吧?我不明白動態代碼是如何工作的,而且必須更深入地研究它。 –