ORM框架示例及查詢測試,上首頁修改版(11種框架)


繼上次ORM之殤,我們需要什么樣的ORM框架? 

整理了11個ORM框架測試示例,通過示例代碼和結果,能很容易了解各種框架的特性,優缺點,排名不分先后

  • EF
  • PDF
  • XCODE
  • CRL
  • NHibernate
  • MySoft
  • Moon
  • Cyq
  • Dapper
  • IBatisNet
  • LoognOrm

框架風格

  • 完全對象化,以Linq&Lambda語法為依托 EF,CRL,NHibernate
  • 只有結果對象化,Cyq,Dapper,IBatisNet,LoognOrm,PDF(以方法參數形式傳遞條件)
  • 使用代理類實現自定義語法 Moon,MySoft,XCODE(需要生成代理類,構造自已的查詢語法)
    語法實現方式也有很多種,詳細可看測試類調用,便捷性也會有很大區別

上面的框架里,以參數形式傳值,效率可能高點,但編程性和便捷性就會差點

 

部署配置

  • 需供助工具生成MODEL Moon,MySoft,PDF,XCODE
  • 需要定義對象映射 NHibernate,IBatisNet,IBatisNet配置起來很麻煩
  • 只需寫MODEL EF,CRL,Cyq,Dapper,LoognOrm

開放數據連接

  有些ORM只提供了從config文件讀取數據連接,這樣做很是不方便(最新版有沒有不知)

  不能以編程方式實現的有 IBatisNet,Moon,PDF,XCODE

 

測試目的

  1. 測試ORM數據訪問性能,比較簡單粗暴,統計對象映射轉換和返回時間,(純對象化的ORM用時會比用參數形式的ORM長)
  2. ORM開發調用實現方式,不同ORM開發風格和便捷性一目了然

測試結果

  • EF和NHibernate平均下來稍慢點,其它區別不大
  • 實現方式純對象化操作的ORM會更方便點
  • 需要手動映射對象的開發起來會更麻煩

測試實現

為了體現ORM過程,盡量使用對象來表示

各種ORM屬性實現方式可能不一樣,所以定義成了接口

實體接口

public interface IProduct
    {
        int Id { get; set; }
        string ProductId { get; set; }
        string ProductName { get; set; }
        string BarCode { get; set; }
        DateTime AddTime { get; set; }
    }

測試接口

這里只定義了參數index,在方法里按index創建對應的對象

public interface ITester
    {
        IProduct GetProduct(int index);
        string Remark { get; }
        bool Insert(int index);
        int Select(int index);
        int Update(int index);
        int Delete(int index);
    }

接口實現示例

為了測試ORM性能,盡量不拼接SQL,這將直接影響結果

public class CRLTester : ITester
    {
        public string Remark
        {
            get
            {
                return "";
            }
        }
        public IProduct GetProduct(int index)
        {
            return new Product() { Id = index, ProductName = "ProductName" + index, BarCode = "BarCode" + index, AddTime = DateTime.Now };
        }
        public bool Insert(int index)
        {
            var data = GetProduct(index) as Product;
            ProductManage.Instance.Add(data);
            return true;
        }

        public int Select(int index)
        {
            var data = GetProduct(index) as Product;
            var list = ProductManage.Instance.QueryList(b => b.ProductName == data.ProductName);
            return list.Count;
        }

        public int Delete(int index)
        {
            var data = GetProduct(index) as Product;
            var n = ProductManage.Instance.Delete(b => b.Id == data.Id);
            return n;
        }


        public int Update(int index)
        {
            var data = GetProduct(index) as Product;
            //因為不是查詢出來的,手動設置哪些屬性被更改了
            data.Change(b => b.ProductName);
            data.Change(b => b.BarCode);
            return ProductManage.Instance.Update(data);
        }
    }

測試過程,調用接口實現,對增刪改查循環執行指定次數

static string DoTest(ITester tester, TestType type,int n)
        {
            Stopwatch sw = new Stopwatch();
            //插入
            sw.Start();
            for (int i = 1; i <= n; i++)
            {
                switch (type)
                {
                    case TestType.DELETE:
                        tester.Delete(i);
                        break;
                    case TestType.INSERT:
                        tester.Insert(i);
                        break;
                    case TestType.SELECT:
                        tester.Select(i);
                        break;
                    case TestType.UPDATE:
                        tester.Update(i);
                        break;
                }
            }
            sw.Stop();
            var times = sw.ElapsedMilliseconds;
            var avg = times / Convert.ToDouble(n);
            return string.Format("{0},用時 {1} 毫秒 平均 {2}", type, sw.ElapsedMilliseconds, avg);
        }

使用本地數據庫local測試,結果如下(僅供參考)

EF 100次 開始測試 2015/4/13 16:28:48
INSERT,用時 1459 毫秒 平均 14.59
SELECT,用時 555 毫秒 平均 5.55
UPDATE,用時 483 毫秒 平均 4.83
DELETE,用時 178 毫秒 平均 1.78
===================================
CRL 100次 開始測試 2015/4/13 16:28:54
INSERT,用時 144 毫秒 平均 1.44
SELECT,用時 190 毫秒 平均 1.9
UPDATE,用時 81 毫秒 平均 0.81
DELETE,用時 172 毫秒 平均 1.72
===================================
PDF 100次 開始測試 2015/4/13 16:28:58
INSERT,用時 173 毫秒 平均 1.73
SELECT,用時 129 毫秒 平均 1.29
UPDATE,用時 153 毫秒 平均 1.53
DELETE,用時 51 毫秒 平均 0.51
===================================
XCODE 100次 開始測試 2015/4/13 16:29:01
INSERT,用時 432 毫秒 平均 4.32
SELECT,用時 146 毫秒 平均 1.46
UPDATE,用時 172 毫秒 平均 1.72
DELETE,用時 123 毫秒 平均 1.23
===================================
NHibernate 100次 開始測試 2015/4/13 16:29:11
INSERT,用時 317 毫秒 平均 3.17
SELECT,用時 482 毫秒 平均 4.82
UPDATE,用時 155 毫秒 平均 1.55
DELETE,用時 178 毫秒 平均 1.78
===================================
MySoft 100次 開始測試 2015/4/13 16:29:15
INSERT,用時 374 毫秒 平均 3.74
SELECT,用時 309 毫秒 平均 3.09
UPDATE,用時 318 毫秒 平均 3.18
DELETE,用時 247 毫秒 平均 2.47
===================================
Moon 100次 開始測試 2015/4/13 16:29:19
INSERT,用時 185 毫秒 平均 1.85
SELECT,用時 105 毫秒 平均 1.05
UPDATE,用時 81 毫秒 平均 0.81
DELETE,用時 127 毫秒 平均 1.27
===================================
Cyq 100次 開始測試 2015/4/13 16:29:24
INSERT,用時 225 毫秒 平均 2.25
SELECT,用時 131 毫秒 平均 1.31
UPDATE,用時 63 毫秒 平均 0.63
DELETE,用時 304 毫秒 平均 3.04
===================================
Dapper 100次 開始測試 2015/4/13 16:29:28
INSERT,用時 141 毫秒 平均 1.41
SELECT,用時 125 毫秒 平均 1.25
UPDATE,用時 57 毫秒 平均 0.57
DELETE,用時 80 毫秒 平均 0.8
===================================
IBatisNet 100次 開始測試 2015/4/13 16:29:32
INSERT,用時 162 毫秒 平均 1.62
SELECT,用時 111 毫秒 平均 1.11
UPDATE,用時 60 毫秒 平均 0.6
DELETE,用時 94 毫秒 平均 0.94
===================================
LoognOrm 100次 開始測試 2015/4/13 16:29:37
INSERT,用時 109 毫秒 平均 1.09
SELECT,用時 94 毫秒 平均 0.94
UPDATE,用時 96 毫秒 平均 0.96
DELETE,用時 57 毫秒 平均 0.57
===================================

EF插入表現得非常慢,可能是由於它的機制引起的

在上面說的,沒有使用語法解析的ORM,用時相對比較短,其它差不多

影響效率的原因

  • 框架內部機制,比如EF,Insert奇慢
  • 對象映射和語法解析時間 ,對象和表映射轉換,查詢語法解析
  • 生成的語句復雜度和參數化

運行截圖

以上結果僅作參考,以實際測試結果為准,歡迎留言討論

測試項目下載地址:http://files.cnblogs.com/files/hubro/ORMTest.rar?a=2

請更改config文件中的數據連接,IBatisNet需單獨修改


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM