2011-06-06 101 views
5

我正在尋找提升C#/ .NET應用程序的方法。 我到目前爲止發現的是加速執行C#/ .NET應用程序

  1. 使用ngen
  2. 小心when using as operator
  3. 小心使用反射API。用Assembly.LoadFrom()加載dll需要相當長的時間。

還有什麼工具/提示/良好的做法,你必須從C#/。NET程序中獲得最佳性能。

+7

這是非常寬泛和顛倒的。首先讓你的代碼工作,然後解決具體的性能問題。 – 2011-06-06 21:45:44

+0

嘗試從MSDN文章[性能(C#和Visual Basic)](http://msdn.microsoft.com/zh-cn/library/ms173196)開始。也作爲Rico Mariani說測量,測量,測量 – 2011-06-06 22:02:34

回答

5

首先要小心ngen。它可能最終會傷害到性能。有關更多詳細信息,請參閱Jeff Richter的書「CLR via C#,Third Edition」。

就我個人而言,當我需要調整應用程序的性能時,我會使用一個分析器。我更喜歡紅門螞蟻,但市場上有很多好的螞蟻。然而,使用這些可能會有點棘手,因爲它們會產生很多噪音。

我見過的大多數問題通常是由開發人員或整體架構而不是.Net Framework引起的。例如,一個Asp.Net Web應用程序需要30+次調用數據庫才能加載主頁。

1

儘可能記住昂貴的功能。

public static class Expensive 
{ 
    private static readonly ConcurrentDictionary<int, int> _map = 
     new ConcurrentDictionary<int, int>(); 

    public static int Calculate(int n) 
    { 
     return _map.AddOrUpdate(n, Add, (key, value) => value); 
    } 

    static int Add(int key) 
    { 
     return 0; 
    } 
} 
+1

但是,不要盲目做。 – SLaks 2011-06-06 21:55:04

1

你不應該使用ngen,直到你確切知道你的dll將部署在哪個CPU環境中。並且確定它們不會被部署在其他CPU類型上。如果您編譯爲x86本機並在x64上進行部署,這是很糟糕的。您將失去編譯器可能完成JIT的所有優化。

性能取決於您的應用程序試圖執行的操作。如果它是一個數據庫驅動的網絡應用程序和桌面音樂播放器應用程序,指南將會非常不同。但你應該注意避免裝箱/拆箱,大量反射,使用XmlDocument加載一個非常大的Xml文檔,並使用內置的CLR ThreadPool類來執行多線程,記得實現IDisposable僅舉幾例。

1

我曾經花了幾天時間重寫代碼來加速應用程序,實際上我發現我的CompareTo實現中有一個瓶頸,被稱爲數千次。

  • 使用aprofiler
  • 不要浪費時間優化什麼並不重要(在你的情況)。
  • 找出是什麼。