2011-07-22 51 views
8

我正在處理一個代碼庫,它有很多相同的ConfigurationManager.AppSetting調用分散在整個過程中。重複調用ConfigurationManager.AppSettings以獲取appsetting值的性能問題?

這聽起來像是一個可能的性能問題嗎?

或者因爲數據非常小很微不足道而且不「昂貴」?不斷返回文件以獲取數據,還是.NET運行時緩存文件/值/調用?

如果這不是一個性能問題,它是訪問應用程序配置值的一種混亂的方法,應該重新考慮更清晰和一致的實現訪問設置?

+1

就我個人而言,我使用ConfigurationManager,我沒有任何問題,我發現它非常簡單,可以在不必重新編譯問題的情況下更改設置。除非你可以獲得另一種形式的永久內存來保存你的設置,否則通過ConfigurationManager訪問文件對我來說似乎是最好的。 –

回答

11

我會說這是更多的代碼可維護性問題比性能問題。在AppSettings上進行的簡單字典查找不會成爲問題,除非您的代碼嘗試在運行時間爲100次的循環中執行AppSettings查找。這樣的代碼肯定會導致性能問題。但更重要的是,您將在整個代碼庫中擁有ConfigurationManager.AppSettings["MyKey"]。你正在引入一個魔術字符串。如果您必須更改配置文件中的密鑰,則必須徹底搜索並替換所有項目中的密鑰。而且,我們通常會根據appSettings中存儲的值做出一些決定。它並不總是直接閱讀和使用的價值。有時候你會根據價值做出決定。例如,

if (ConfigurationManager.AppSettings["DebugMode"] == "yes") 
    do this 
else 
    do that 

你可能會在百個地方重複這個邏輯。現在讓我們假設你需要在那裏添加另一個條件:

if (ConfigurationManager.AppSettings["DebugMode"] == "yes" || ConfigurationManager.AppSettings["InternetNotAvailable"] == "yes") 
    do this 
else 
    do that 

這會變得混亂。你的代碼開始發臭。

因此,我始終建議我的開發團隊在代碼中的任何地方永遠不要使用ConfigurationManager.AppSettings。在讀取配置值的地方使用一些靜態類,並將所有這些決策預存到一個變量中。例如,

static class ConfigHelper 
{ 
    private readonly static bool ExternalWebserviceCallAllowed = ConfiguationManager.AppSettings["DevMode"] == "false" && ConfigurationManager.AppSettings["InternetAvailable"] == "true"; 

} 

. 
. 
if (ConfigHelper.ExternalWebserviceCallAllowed) 
    do this 
else 
    do that 

這不僅在性能上更好,而且還具有高度可維護和可擴展的代碼。

+0

謝謝,我在其他代碼庫中也看到了這種模式。 –

3

這裏有幾件事。

  1. 您可以驗證這是否是通過使用像螞蟻探查或DotTrace,使您可以檢查應用程序的性能有性能問題
  2. 我要說的是,你可能會開放在未來的一些問題如果您將呼叫分散到各地,請考慮例如如果您決定更改某個應用設置的名稱,則可能會造成災難性後果。我個人建議集中這種類型的東西,如果出於任何原因考慮未來的變化。
  3. 從性能的角度來看,要小心不要「預先優化」那些不需要的東西,否則當不需要時可能會增加更多的複雜性。
+0

偉大的觀點,特別是關於預優化:) –