FreeSql 與 SqlSugar 性能測試
阿新 • • 發佈:2019-03-19
pass names isp 目標 需要 sta config ++ sqlt
這篇文章受大家邀請,與 SqlSugar 做一次簡單的性能測試對比。主要針對插入、批量插入、批量更新、讀取性能的測試;
測試環境
- .net core 2.2
- FreeSql 0.3.17
sqlSugarCore 4.9.9.3
sqlserver 14.00.1000 Express、mysql 5.6
測試項目
以 console 程序,創建步驟:
1、dotnet new console
2、dotnet add package FreeSql
3、dotnet add package sqlSugarCore
編碼的過程
這個錯誤來自 sugar 創建數據庫的時候,實體定義如下:
sugar的沒有同步上來。
暫時先用 freesql 幫 sugar 創建了表。。。創建完後如下:
運行時又出現如下錯誤:
需要加一堆 IsIgnore
是的,還在報錯,最終原因是我傳入的 songs 是 IEnumerable
以 SqlServer 作為目標庫,測試結果
以 MySql 作為目標庫,測試結果
結束語
然而上面提到的批量更新,今天先到這吧。下次有興致了再測試。
其他庫我就不測試了,謝謝觀看!請求獻上寶貴的一星。
github:https://github.com/2881099/FreeSql
最終的測試代碼
using FreeSql.DataAnnotations; using SqlSugar; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; namespace orm_vs { class Program { static IFreeSql fsql = new FreeSql.FreeSqlBuilder() //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=20") .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=20") .UseAutoSyncStructure(false) .UseNoneCommandParameter(true) //.UseConfigEntityFromDbFirst(true) .Build(); static SqlSugarClient sugar { get => new SqlSugarClient(new ConnectionConfig() { //不欺負,讓連接池100個最小 //ConnectionString = "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Min Pool Size=100;Max Pool Size=20", //DbType = DbType.SqlServer, ConnectionString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Min Pool Size=20;Max Pool Size=20", DbType = DbType.MySql, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute }); } static StringBuilder sb = new StringBuilder(); static void Main(string[] args) { fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag)); sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag)); //sugar創建表失敗:SqlSugar.SqlSugarException: Sequence contains no elements //測試前清空數據 fsql.Delete<Song>().Where(a => a.Id > 0).ExecuteAffrows(); sugar.Deleteable<Song>().Where(a => a.Id > 0).ExecuteCommand(); Console.WriteLine("插入性能:"); Insert(1000, 1); Console.Write(sb.ToString()); sb.Clear(); Insert(1000, 10); Console.Write(sb.ToString()); sb.Clear(); Insert(1, 1000); Console.Write(sb.ToString()); sb.Clear(); Insert(1, 10000); Console.Write(sb.ToString()); sb.Clear(); Insert(1, 50000); Console.Write(sb.ToString()); sb.Clear(); Console.WriteLine("查詢性能:"); Select(1000, 1); Console.Write(sb.ToString()); sb.Clear(); Select(1000, 10); Console.Write(sb.ToString()); sb.Clear(); Select(1, 1000); Console.Write(sb.ToString()); sb.Clear(); Select(1, 10000); Console.Write(sb.ToString()); sb.Clear(); Select(1, 50000); Console.Write(sb.ToString()); sb.Clear(); Select(1, 100000); Console.Write(sb.ToString()); sb.Clear(); Console.Write(sb.ToString()); Console.WriteLine("測試結束,按任意鍵退出..."); Console.ReadKey(); } static void Select(int forTime, int size) { Stopwatch sw = new Stopwatch(); sw.Restart(); for (var a = 0; a < forTime; a++) fsql.Select<Song>().Limit(size).ToList(); sw.Stop(); sb.AppendLine($"FreeSql Select {size}條數據,循環{forTime}次,耗時{sw.ElapsedMilliseconds}ms"); sw.Restart(); for (var a = 0; a < forTime; a++) sugar.Queryable<Song>().Take(size).ToList(); sw.Stop(); sb.AppendLine($"SqlSugar Select {size}條數據,循環{forTime}次,耗時{sw.ElapsedMilliseconds}ms\r\n"); } static void Insert(int forTime, int size) { var songs = Enumerable.Range(0, size).Select(a => new Song { Create_time = DateTime.Now, Is_deleted = false, Title = $"Insert_{a}", Url = $"Url_{a}" }).ToArray(); //預熱 fsql.Insert(songs.First()).ExecuteAffrows(); sugar.Insertable(songs.First()).ExecuteCommand(); Stopwatch sw = new Stopwatch(); sw.Restart(); for (var a = 0; a < forTime; a++) fsql.Insert(songs.AsEnumerable()).ExecuteAffrows(); sw.Stop(); sb.AppendLine($"FreeSql Insert {size}條數據,循環{forTime}次,耗時{sw.ElapsedMilliseconds}ms"); sw.Restart(); for (var a = 0; a < forTime; a++) sugar.Insertable(songs).ExecuteCommand(); sw.Stop(); sb.AppendLine($"SqlSugar Insert {size}條數據,循環{forTime}次,耗時{sw.ElapsedMilliseconds}ms\r\n"); } } [Table(Name = "freesql_song")] [SugarTable("sugar_song")] public class Song { [Column(IsIdentity = true)] [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public DateTime? Create_time { get; set; } public bool? Is_deleted { get; set; } public string Title { get; set; } public string Url { get; set; } [SugarColumn(IsIgnore = true)] public virtual ICollection<Tag> Tags { get; set; } } [Table(Name = "freesql_song_tag")] [SugarTable("sugar_song_tag")] public class Song_tag { public int Song_id { get; set; } [SugarColumn(IsIgnore = true)] public virtual Song Song { get; set; } public int Tag_id { get; set; } [SugarColumn(IsIgnore = true)] public virtual Tag Tag { get; set; } } [Table(Name = "freesql_tag")] [SugarTable("sugar_tag")] public class Tag { [Column(IsIdentity = true)] [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public int? Parent_id { get; set; } [SugarColumn(IsIgnore = true)] public virtual Tag Parent { get; set; } public decimal? Ddd { get; set; } public string Name { get; set; } [SugarColumn(IsIgnore = true)] public virtual ICollection<Song> Songs { get; set; } [SugarColumn(IsIgnore = true)] public virtual ICollection<Tag> Tags { get; set; } } }
FreeSql 與 SqlSugar 性能測試