比較方式: 對相同的資料表讀取 1000 次,來比較速度。
資料庫為 MS SQL
這裡做了 4 個 Case:
Case 1:
使用 Entity Framework,DbContext 為每次 new 一個。
Case 2:
使用 Entity Framework,使用同一個 DbContext。
Case 3:
用 DAO,轉為 Data Table 的格式 (使用 DtFromSql)。
Case 4:
使用 Dapper。
專案啟動時的記憶體使用量約為: 123 MB
測試一:
第一次讀取
Case 1, 時間: 3673.0303 ms, 記憶體: 566 MB
Case 2, 時間: 3889.9379 ms, 記憶體: 304 MB (這個時間有時會測試到 3000 ms)
Case 3, 時間: 1665.7748 ms, 記憶體: 205 MB
Case 4, 時間: 1639.7211 ms, 記憶體: 193 MB
讀取五次
Case 1, 時間: 1984.6395, 記憶體: 544MB (有發生 GC)
Case 2, 時間: 2367.9792 ms, 記憶體: 627 MB (沒有發生 GC)
Case 3, 時間: 1395.1132 ms, 記憶體: 280 MB (有發生 GC)
Case 4, 時間: 1531.3555 ms, 記憶體: 271 MB
結果: Dapper 看來完勝,速度上和直接使用 DAO 轉進 Data Table 的速度相近。但 Dapper 傳回的結果已經轉換為物件 List, 操作上會更為方便。
Entity Framework 一如預期的較慢,且花費較多的記憶體。但和想像中最大的差異是,使用同一個 DbContext 比 new 1000 個 DbContext 的速度還要慢, 花費的記憶體在 GC 之後,差異不大。
所以不一定要用 DI 注入 DbContext, 在各 function 中一直傳遞 DbContext. 在 Static 的 function 中,可以安心的 new 一個 DbContext 出來使用吧,只是要記得用 using 哦,否則可能會有 connection 沒有關閉的問題。