sqlsugar freesql hisql 三個ORM框架效能測試對比

tansar發表於2022-01-07

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秒

分析

  1. 5條資料時 HiSql比SqlSugar快2.91倍 比freesql快2.5倍,從資料可以看得出在這個資料檔位sqlsugar表現是慢的 freesql比sqlsugar快14%

  2. 10條數量測試三個ORM的線性變化值不大 依然是hisql最快 freesql次之,sqlsugar相對比freesql慢一點

  3. 50條資料時 hisql比sqlsugar快2.09倍 比freesql快2.47倍 ,此時sqlsugar比freesql快18%,可以看出freesql在數量增長時他的效能也是呈下滑趨勢

  4. 100條資料時 hisql比sqlsugar快1.67倍 比freesql快3.28倍,sqlsugar比freesql快1.95倍,sqlsugar與Hisql差距慢慢在縮小,但freesql與其它兩個orm框架相比差距越來越大

  5. 當資料達到100000條時 hisql依然比sqlsugar保持在絕對性的優勢

從測試結果來看 HiSql的效能測試名列前茅 sqlsugar次之 freesql表現最差

hisql.net 官網(文件編寫中)

HiSql查詢語句教程

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

相關文章