情境,我建立一個 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 USERS { get; set; }
public void OnGet()
{
USERS = new List();
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 += " ";
Result += stopwatch2.Elapsed;
}
public List 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 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
所以比較起來 第一種方法略快一點
--
The bug existed in all possible states.
Until I ran the code.