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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM