闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置。
测试机是I7,16G内存,这里只根据测试场景写了最简单的数据库操作测试。
采用了火地晋的测试工具,下面是测试代码
1 public class DataTest :ITest 2 { 3 4 public void Init() 5 { 6 } 7 8 public bool Insert() 9 { 10 var _repository = new Repository<DbAccessLibTest.Model.Test>(); 11 var model = new DbAccessLibTest.Model.Test(); 12 model.Guid = Guid.NewGuid().ToString(); 13 return _repository.Save(model, DbAccessLibTest.Model.Test._Guid) > 0; 14 } 15 16 public bool Update(string guid, string content) 17 { 18 var _repository = new Repository<DbAccessLibTest.Model.Test>(); 19 var model = new DbAccessLibTest.Model.Test(); 20 model.Content = content; 21 return _repository.Update(model, DbAccessLibTest.Model.Test._Guid == guid, DbAccessLibTest.Model.Test._Content) > 0; 22 } 23 24 public System.Data.DataTable Select(int count) 25 { 26 var _repository = new Repository<DbAccessLibTest.Model.Test>(); 27 var list = _repository.Find(new QueryWhere(), count); 28 return null; 29 } 30 31 public List<string> GetGuidList(int count) 32 { 33 var _repository = new Repository<DbAccessLibTest.Model.Test>(); 34 var list = _repository.Find(new QueryWhere(), count, null, 0, DbAccessLibTest.Model.Test._Guid); 35 var guids = new List<string>(); 36 foreach (var test in list) 37 { 38 guids.Add(test.Guid); 39 } 40 return guids; 41 } 42 43 public bool Delete(string guid) 44 { 45 var _repository = new Repository<DbAccessLibTest.Model.Test>(); 46 var model = new DbAccessLibTest.Model.Test(); 47 model.Guid = guid; 48 return _repository.Delete(model) > 0; 49 } 50 }
大致了解了一下,一下采用10/100/500/1000个线程,10个查询测试,节省时间,直接和ClownFish对比
Inset | Delete | Update | Select | ||||||||||
平均值 | 最高 | 最低 | 平均值 | 最高 | 最低 | 平均值 | 最高 | 最低 | 平均值 | 最高 | 最低 | ||
10线程 | ClownFish | 279 | 406 | 221 | 304 | 359 | 268 | 262 | 361 | 158 | 8 | 9 | 7 |
MyData | 475 | 720 | 249 | 527 | 727 | 244 | 462 | 705 | 253 | 10 | 13 | 8 | |
100线程 | ClownFish | 573 | 1246 | 154 | 646 | 1323 | 217 | 365 | 1117 | 140 | 8 | 22 | 6 |
MyData | 599 | 1716 | 320 | 730 | 1899 | 303 | 784 | 1771 | 291 | 10 | 14 | 8 | |
500线程 | ClownFish | 7097 | 22106 | 225 | 3691 | 19673 | 97 | 4017 | 20029 | 158 | 9 | 35 | 7 |
MyData | 591 | 1263 | 181 | 1416 | 8583 | 297 | 5556 | 27463 | 376 | 10 | 19 | 8 | |
1000线程 | ClownFish | 7967 | 30946 | 166 | 5502 | 21291 | 163 | 6300 | 28062 | 145 | 8 | 68 | 6 |
MyData | 606 | 1242 | 249 | 577 | 2719 | 203 | 608 | 1043 | 270 | 10 | 22 | 8 |
总体来看,公司的ORM性能较ClowFish差上20%-50%,但性能较稳定,1000线程测试全部跑完,无异常产生,ClowFish在200线程以内无异常,200线程以后,出现(执行错误,信息:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。)异常,导致执行时间波动较大。
这个测试和原来公司压力测试结果差不多,压力测试公司ORM是直接ado.net执行的1.5倍性能左右。