2012-01-05 81 views
0

目前我們有相當厚實的審計制度爲我們的應用程序中的對象,流程是這樣的..對象審覈

-Class實現一個接口

迫使γ-接口的類重寫添加一些方法需要審覈來KeyValuePairs的列表屬性

-Class然後還需要重新創建鍵值對

現在,開發人員需要這一切都加入到有課,ALS的列表中的對象狀態我們的對象經常變化,所以我們不只是連續化課程。

我想要做的就是使用的屬性標記屬性爲審計,然後自動完成一切,所以開發商並不真正需要做任何事情。

我的主要問題是 - 我知道人們總是說反射慢,怎麼慢,我們談論?我將通過查看課程並查看屬性和屬性來獲得什麼樣的性能,然後執行所需的邏輯?

感謝您的幫助

科技教育,

回答

1

很難給出具體的答案,因爲它取決於您的應用程序具有足夠的性能。

反思是慢然後正常編譯的代碼,但不必擔心性能問題時,它總是最好有一些作品,然後用分析來發現真正的性能瓶頸和優化。

不成熟的優化可能會導致代碼難以維護,因此開發人員的生產力會降低。

我會從使用反射開始,寫一組很好的單元測試,讓你知道你的代碼正在工作。如果性能成爲問題,則可以使用Visual Studio Profiler來分析單元測試並發現瓶頸。

有一些庫可以加快反射速度,或者如果速度緩慢,可以使用Expression樹來代替反射代碼。

0

如果performance好不好取決於你的應用程序上下文。所以很難說,如果它是緩慢或快速爲你,你應該自己嘗試。

最可能的是,海事組織,它會給相當可接受的性能,但同樣我不知道在哪裏,你要使用它。

一樣浮現在我的腦海裏其他的解決方案,可能是:

  • sqlite的,在那裏保存key/value數據
  • 面向方面編程(如PostSharp)來生成編譯時數據。

但第一件事會嘗試,是一個反射,就像你想的那樣。

+0

感謝您的迴應,我沒有計劃最初使用PostSharp來避免反思並生成所需的所有代碼,但是我的公司將不會爲任何企業悲傷地使用付費。我嘗試反思,並嘗試獲得一些基準點! – Steoates 2012-01-05 10:08:00

0

閱讀this響應來自馬克·我建議的反思應該是適合大多數應用需求。

進行任何根本性的變化,我建議運行探查發現在你的代碼中的瓶頸之前。如果您確定反射/審計過程是主要難點,請使用IL Emit並再試一次。

+0

我已更新; p – 2012-02-02 09:58:49

0

反射是去這裏的路。如果速度太慢(測量!),你可以投入一點緩存,或者在最壞的情況下產生一個Expression<T>並編譯它。

有您的問題分爲兩個階段:

  1. 找出你想要的屬性,並歸還其PropertyInfo s的名單。你只需要每種類型只做一次,然後你就可以緩存它。因此,這一步的表現並不重要。
  2. 獲取每個屬性的價值與PropertyInfo.GetValue

如果此步驟2速度太慢,則需要在步驟1中生成一個表達式,並且手動編寫的代碼的開銷將下降到單個委託調用。