hisql與目前比較流行的ORM框架效能測試對比
測試環境
資料庫sqlserver 配置如下
總體測試結果
插入記錄數 | hisql(耗時) | sqlsugar(耗時) | freesql(耗時) |
---|---|---|---|
5條 | 0.0107秒 |
0.0312秒 |
0.02675秒 |
10條 | 0.0111秒 |
0.0307秒 |
0.0271秒 |
50條 | 0.0174秒 |
0.0364秒 |
0.0430秒 |
100條 | 0.0281秒 |
0.0472秒 |
0.0922秒 |
200條 | 0.0310秒 |
0.0584秒 |
0.2319秒 |
500條 | 0.0712秒 |
0.1127秒 |
0.5996秒 |
1000條 | 0.1112秒 |
0.1871秒 |
0.8145秒 |
10000條 | 1.0440秒 |
1.6415秒 |
5.3671秒 |
100000條 | 10.3279秒 |
15.8685秒 |
46.0261秒 |
分析
-
5條資料時 HiSql比SqlSugar快2.91倍 比freesql快2.5倍,從資料可以看得出在這個資料檔位sqlsugar表現是慢的 freesql比sqlsugar快14%
-
10條數量測試三個ORM的線性變化值不大 依然是hisql最快 freesql次之,sqlsugar相對比freesql慢一點
-
50條資料時 hisql比sqlsugar快2.09倍 比freesql快2.47倍 ,此時sqlsugar比freesql快18%,可以看出freesql在數量增長時他的效能也是呈下滑趨勢
-
100條資料時 hisql比sqlsugar快1.67倍 比freesql快3.28倍,sqlsugar比freesql快1.95倍,sqlsugar與Hisql差距慢慢在縮小,但freesql與其它兩個orm框架相比差距越來越大
-
當資料達到100000條時 hisql依然比sqlsugar保持在絕對性的優勢
從測試結果來看 HiSql的效能測試名列前茅 sqlsugar次之 freesql表現最差
HiSql 原始碼(github) https://github.com/tansar/HiSql
git clone https://github.com/tansar/HiSql.git
當前測試原始碼(github) https://github.com/tansar/HiSqlTestDemo
git clone https://github.com/tansar/HiSqlTestDemo.git
測試原始碼
using System;
using System.Collections.Generic;
using System.Diagnostics;
using HiSql;
using SqlSugar;
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
//hisql連線 請先配置好資料庫連線
HiSqlClient sqlClient = Demo_Init.GetSqlClient();
//hisql需要初始貨安裝 只需要執行一次
sqlClient.CodeFirst.InstallHisql();
//freesql連線
IFreeSql freeClient = Demo_Init.GetFreeSqlClient();
//sqlsugar連線
SqlSugarClient sugarClient = Demo_Init.GetSugarClient();
int _count = 100000;
sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01));
Console.WriteLine("初始化hisql專用表成功!");
sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02));
Console.WriteLine("初始化sqlsugar專用表成功!");
sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
Console.WriteLine("初始化freesql專用表成功!");
Console.WriteLine($"測試場景 向表中插入{_count}條資料,都用各個ORM常用的插入試(不用bulkcopy因為這個方法是底層庫提供的)");
Console.WriteLine($"用常規資料插入最適應日常應用場景");
List<object> lstobj = new List<object>();
List<Table.HTest02> lstobj2 = new List<Table.HTest02>();
List<Table.HTest03> lstobj3 = new List<Table.HTest03>();
Random random = new Random();
//插入的引數值都隨機產生 以免資料庫執行相同SQL時會有快取影響測試結果
for (int i = 0; i < _count; i++)
{
//hisql可以用實體類也可以用匿名類
lstobj.Add( new { SID=(i+1), UName=$"hisql{i}",Age=20+( i % 50), Salary=5000+(i%2000)+ random.Next(10), Descript=$"hisql初始建立" });
//sqlsugar用匿句類報錯用實體類
lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar初始建立" });
lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql初始建立" });
}
//刪除測試表中的資料
sqlClient.TrunCate("HTest01").ExecCommand();
sqlClient.TrunCate("HTest02").ExecCommand();
sqlClient.TrunCate("HTest03").ExecCommand();
Stopwatch sw = new Stopwatch();
#region freesql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------FreeSql 測試----------");
Console.WriteLine($"FreeSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
var temp3 = freeClient.Queryable<Table.HTest03>().Where(w => w.Age < 0).ToList();
Console.WriteLine($"FreeSql 正在插入資料\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows();
sw.Stop();
Console.WriteLine($"FreeSql 資料插入{_count}條 耗時{sw.Elapsed}秒");
sw.Reset();
#endregion
#region sqlsugar
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------SqlSugar 測試----------");
Console.WriteLine($"SqlSugar 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
var temp2 = sugarClient.Queryable<Table.HTest02>("HTest02").Where(w => w.Age < 1).ToList();
Console.WriteLine($"sqlsugar 正在插入資料\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
sugarClient.Insertable(lstobj2).AS("HTest02").ExecuteCommand();
sw.Stop();
Console.WriteLine($"sqlsugar 資料插入{_count}條 耗時{sw.Elapsed}秒");
sw.Reset();
#endregion
#region hisql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------HiSql 測試----------");
Console.WriteLine($"HiSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
Console.WriteLine($"HiSql 正在插入資料\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
sqlClient.Insert("HTest01", lstobj).ExecCommand();
sw.Stop();
Console.WriteLine($"hisql 資料插入{_count}條 耗時{sw.Elapsed}秒");
sw.Reset();
#endregion
var s = Console.ReadLine();
}
}
}
hisql sqlsugar freesql 插入5條資料測試
hisql sqlsugar freesql 插入10條資料測試
hisql sqlsugar freesql 插入50條資料測試
hisql sqlsugar freesql 插入100條資料測試
hisql sqlsugar freesql 插入200條資料測試
hisql sqlsugar freesql 插入500條資料測試
hisql sqlsugar freesql 插入1000條資料測試
hisql sqlsugar freesql 插入10000條資料測試
hisql sqlsugar freesql 插入100000條資料測試
後續請關注bulkcopy的效能測試對比