[C#] 一個無聊的小測試關於使用 LINQ 找尋最小群體的不同寫法的測速

2022-09-21

最近跟同事討論一個有趣的議題,就是我們有一群物件,裡面我們要找到某屬性最小得群體(可能多個可能一個)

但是我的思維點跟同事竟然不一樣,這時候我就好奇了到底哪一個比較快



情境,我建立一個 User 物件,我假設 Age 1-1000 , 而且每一個 Age 都有一千人,也就是 有一百萬的資料在List 中

然後我各跑100次當作一次基準點,每一次跑我都會先做

Test1 的跑法 我先取 Age 中的 Min 在 retuen Where Age==Min

Test2 的跑法也是我同事比較常用的 先做 GroupBy 在做 Order 在 FrisrtOrDefault


public class Race1Model : PageModel { public string Result { get; set; } public List<User> USERS { get; set; } public void OnGet() { USERS = new List<User>(); MakeData(); var stopwatch1 = new Stopwatch(); stopwatch1.Start(); for (var i = 1; i <= 100; i++) { var result1 = Test1(); } stopwatch1.Stop(); var stopwatch2 = new Stopwatch(); stopwatch2.Start(); for (var i = 1; i <= 100; i++) { var result1 = Test2(); } stopwatch2.Stop(); Result += stopwatch1.Elapsed; Result += "<br>"; Result += stopwatch2.Elapsed; } public List<User> Test1() { //shuffle var shuffleUsers = USERS.OrderBy(x => Guid.NewGuid()).ToList(); var minAge = shuffleUsers.Min(x => x.Age); return shuffleUsers.Where(x => x.Age == minAge).ToList(); } public List<User> Test2() { //shuffle var shuffleUsers = USERS.OrderBy(x => Guid.NewGuid()).ToList(); var minAger = shuffleUsers.GroupBy(x => x.Age).OrderBy(x => x.Key).FirstOrDefault().ToList(); return minAger; } public void MakeData() { for (var i = 1; i <= 1000; i++) { for (var j = 1; j <= 1000; j++) { USERS.Add(new Models.User { Id = $"USER{i}-{j}", Age = i, Birth = new DateTime(1970, 1, 1).AddDays(i) }); } } } }


結果

TEST1:00:02:35.4317340

TEST2:00:02:59.0842706

-

TEST1:00:02:29.8143663

TEST2:00:02:45.4453072

-

TEST1:00:02:13.7057643

TEST2:00:02:22.1580417

-

TEST1:00:02:11.7511305

TEST2:00:02:14.8721850

-

TEST1:00:02:12.5118789

TEST2:00:02:15.1015652

-

TEST1:00:02:02.7448763

TEST2:00:02:26.7290182


所以比較起來 第一種方法略快一點


當麻許的碎念筆記 2014 | Donma Hsu Design.