整理了11個ORM框架測試示例,通過示例代碼和結果,能很容易了解各種框架的特性,優缺點,排名不分先后
- EF
- 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
測試目的
- 測試ORM數據訪問性能,比較簡單粗暴,統計對象映射轉換和返回時間,(純對象化的ORM用時會比用參數形式的ORM長)
- 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需單獨修改
