上一篇文章 物件輸出的 JSON 按照 Property Name 排序的兩種方法 ,其中提供兩種方法來做到排序物件後 JSON輸出
這時候我同事問我要採用哪一種,其實我也不知道,反正文章都寫了範例程式稍微小改一下,直接測速吧

因為只是測試,所以相關文章請去參考 物件輸出的 JSON 按照 Property Name 排序的兩種方法 ,然後我各跑一千萬次
跑五輪測試成績
直接上程式碼
var user1 = new User { Birth = DateTime.Now, Id = "USER1", Memo = "I am User1", Salary = 1_000_000 };
var user2 = new User { Birth = DateTime.Now, Id = "USER2", Memo = "I am User2", Salary = 2_000_000 };
var user3 = new User { Birth = DateTime.Now, Id = "USER3", Memo = "I am User3", Salary = 3_000_000 };
user1.Friends.Add(user2);
user1.Friends.Add(user3);
for (var i = 1; i <= 5; i++)
{
Console.WriteLine("第 " + i +"輪千萬測試" );
Stopwatch sw = new Stopwatch();
sw.Start();
Parallel.For(0, 10_000_000,
index =>
{
var json = JsonConvert.SerializeObject(user1);
});
sw.Stop();
Console.WriteLine("沒有排序:" + sw.Elapsed);
sw.Restart();
Parallel.For(0, 10_000_000,
index =>
{
var sortJObjet = SortPropertiesAlphabetically(JObject.FromObject(user1));
var result = JsonConvert.SerializeObject(sortJObjet);
});
Console.WriteLine("透過 JObject:" + sw.Elapsed);
sw.Stop();
sw.Restart();
Parallel.For(0, 10_000_000,
index =>
{
var expando = new ExpandoObject();
var dictionary = (IDictionary)expando;
foreach (var property in user1.GetType().GetProperties().OrderBy(x => x.Name))
{
dictionary.Add(property.Name, property.GetValue(user1));
}
var result = JsonConvert.SerializeObject(dictionary);
});
sw.Stop();
Console.WriteLine("透過 ExpandoObject:" + sw.Elapsed);
結果
第 1輪千萬測試
沒有排序:00:00:12.3518069
透過 JObject:00:00:55.8608258
透過 ExpandoObject:00:00:21.5615376
第 2輪千萬測試
沒有排序:00:00:11.2667876
透過 JObject:00:00:54.4216864
透過 ExpandoObject:00:00:21.9325571
第 3輪千萬測試
沒有排序:00:00:11.3775666
透過 JObject:00:00:54.4805545
透過 ExpandoObject:00:00:20.6154214
第 4輪千萬測試
沒有排序:00:00:11.1592938
透過 JObject:00:00:58.7714687
透過 ExpandoObject:00:00:23.1765868
第 5輪千萬測試
沒有排序:00:00:12.4622190
透過 JObject:00:01:03.9443235
透過 ExpandoObject:00:00:21.9992367
簡單結論
如果你在寫 class 的時候 按照字母排列,直接輸出效率一定最好,再來就是 ExpandoObject ,最後是轉 JObject 進行排序