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的性能測試對比
