首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 效能優化:單例模式減少物件建構銷毀開銷

     編輯:關於.NET

問題情境

ASP.NET WebForms 頁面生命週期中,若每次請求都 new 一個服務物件 (如 PeopleServer),在高併發下會造成大量記憶體分配與 GC 壓力。若該物件無狀態、線程安全,完全可以共用單一實例。

重構前:每次請求新建實例

public class PeopleServer {
    public PeopleServer() { }
    public string ToStringPeople(People p) {
        return string.Format("Name:{0},Age:{1};", p.Name, p.Age);
    }
}
public class People { public string Name { get; set; } public int Age { get; set; } }

// 頁面中使用
PeopleServer server = new PeopleServer(); // 每次請求配置記憶體
string result = server.ToStringPeople(p);

重構後:單例模式 (Thread-Safe Lazy 初始化)

public class PeopleServer {
    private static readonly Lazy<PeopleServer> _instance =
        new Lazy<PeopleServer>(() => new PeopleServer(), LazyThreadSafetyMode.ExecutionAndPublication);

    private PeopleServer() { } // 防止外部實例化

    public static PeopleServer Instance { get { return _instance.Value; } }

    public string ToStringPeople(People p) {
        return string.Format("Name:{0},Age:{1};", p.Name, p.Age);
    }
}

// 使用方式
PeopleServer server = PeopleServer.Instance; // 全程共用同一實例
string result = server.ToStringPeople(p);

關鍵點解析

  • Lazy<T> 確保線程安全、延遲初始化 (首次存取 Instance 才建立)
  • private constructor 強制單一實例
  • 無狀態服務 (無欄位、屬性儲存請求相關資料) 才適合單例
  • 若服務持有非線程安全資源 (如 DbContext),不可 用單例,應採用每請求一個實例 (Dependency Injection Scope)

適用場景擴展

  • 設定檔讀取器 (啟動讀取、唯讀)
  • 快取管理器
  • 無狀態工具類 (序列化、加密、格式化)
  • 記錄器

總結

單例模式透過「只建構一次、全域共用」消除重複配置開銷,是無狀態服務在高併發 Web 應用的經典優化手段。現代 .NET 建議使用 Lazy<T> 實現線程安全延遲初始化,搭配 DI 容器 (如 ASP.NET Core 內建 AddSingleton) 管理生命週期,比手寫雙重檢查鎖定更簡潔可靠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved