.Net C# JSON 效能測試 JavaScriptSerializer、Json.NET、fastJSON .Net C# JSON 效能測試 JavaScriptSerializer、Json.NET、fastJSON
  .NET       ez      2013-08-27

本篇測試 JSON TO String 及 String TO JSON,使用以下三種方式 JavaScriptSerializer、Json.NET、fastJSON 進行效能測試 。

測試原始碼下載:fastJsonDemo

原始碼如下:

using System;
using System.Diagnostics;
using System.Web.Script.Serialization;
using fastJSON;
using Newtonsoft.Json;
namespace fastJsonDemo
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            testSpeed();
            Write("<BR>");
            testConvertDatetime();
        }
        protected void testSpeed() {
            int i_testCount = 30000;
            User[] l_users = new User[i_testCount];
            for (int i = 0; i < i_testCount; i++) l_users[i] = new User { ID = i, Name = "TEST", Age = 20 + i, Address = "100 臺北市..." + i.ToString() + "號" };
            /* 使用 JavaScriptSerializer */
            testJavaScriptSerializer(l_users);
            /* 使用 Json.NET  */
            testJsonDotNET(l_users);
            /* 使用 fastJSON  */
            testfastJSON(l_users);
        }
        protected void testJavaScriptSerializer(User[] l_users)
        {            
            string s_jsonstr = string.Empty;
            Stopwatch sw = new Stopwatch();
            Write("<BR>使用 JavaScriptSerializer 物件 to JSON<BR>", "#524CE4", true);            
            sw.Reset();
            sw.Start();
            s_jsonstr = ConvertObject2JSON(l_users);
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write("使用 JavaScriptSerializer JSON to 物件<BR>", "#524CE4", true);
            sw.Reset();
            sw.Start();
            User[] l_tempusers = (User[])ConvertJSON2Object(s_jsonstr, typeof(User[]));
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write(ConvertObject2JSON(new User[] { l_users[0], l_users[1], l_users[2] }) + "<BR>", "#F74B14", false);        
        }
        protected void testJsonDotNET(User[] l_users)
        {
            string jsonstr = string.Empty;
            Stopwatch sw = new Stopwatch();
            Write("<BR>使用 Json.NET 物件 to JSON<BR>", "#524CE4", true);
            sw.Reset();
            sw.Start();
            jsonstr = JsonConvert.SerializeObject(l_users);
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write("使用 Json.NET JSON to 物件<BR>", "#524CE4", true);
            sw.Reset();
            sw.Start();
            User[] l_tempusers = JsonConvert.DeserializeObject<User[]>(jsonstr);
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write(JsonConvert.SerializeObject(new User[] { l_users[0], l_users[1], l_users[2] }) + "<BR>", "#F74B14", false);
        }
        protected void testfastJSON(User[] l_users)
        {
            string s_jsonstr = string.Empty;
            Stopwatch sw = new Stopwatch();
            Write("<BR>使用 fastJSON 物件 to JSON<BR>", "#524CE4", true);
            sw.Reset();
            sw.Start();
            s_jsonstr = JSON.Instance.ToJSON(l_users);
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write("使用 fastJSON JSON to 物件<BR>", "#524CE4", true);
            sw.Reset();
            sw.Start();
            User[] l_tempusers = fastJSON.JSON.Instance.ToObject(s_jsonstr) as User[];
            sw.Stop();
            Write(sw.Elapsed.Milliseconds.ToString() + " ms<BR>", "#666", true);
            Write(JSON.Instance.ToJSON(new User[] { l_users[0], l_users[1], l_users[2] }) + "<BR>", "#F74B14", false);
        }
        protected void testConvertDatetime() {
            string s_js = string.Empty;
            DateTime dt = DateTime.Now;
            Write("<BR>使用  JavaScriptSerializer <BR>", "#8F3535", true);
            s_js = ConvertObject2JSON(dt);
            Write(s_js + " <BR>", "#666", true);
            Write(((DateTime)ConvertJSON2Object(s_js, typeof(DateTime))).ToString() + " <BR>", "#666", true);
            Write("<BR>使用 Json.NET <BR>", "#8F3535", true);
            s_js = JsonConvert.SerializeObject(dt);
            Write(s_js +"<BR>", "#666", true);
            Write(JsonConvert.DeserializeObject<DateTime>(s_js).ToString() + "<BR>", "#666", true);
            Write("<BR>使用 fastJSON <BR>", "#8F3535", true);
            s_js = JSON.Instance.ToJSON(dt);
            Write(s_js + " <BR>", "#666", true);
            Write(DateTime.Parse(JSON.Instance.ToObject(s_js).ToString()).ToString() + " <BR>", "#666", true);
        }
        protected string ConvertObject2JSON(object Source)           
        {
            JavaScriptSerializer JSONSerializer = new JavaScriptSerializer();
            JSONSerializer.RecursionLimit = Int32.MaxValue;
            return JSONSerializer.Serialize(Source);
        }
        protected object ConvertJSON2Object(string JSON, Type ObjectType)
        {
            JavaScriptSerializer JSONSerializer = new JavaScriptSerializer();
            JSONSerializer.RecursionLimit = Int32.MaxValue;
            return JSONSerializer.Deserialize(JSON, ObjectType);
        }
        protected void Write(string word, string color, bool bord)
        {
            if (bord)
                Response.Write("<b><font color=\"" + color + "\">" + word + "</font></b>");
            else
                Response.Write("<font color=\"" + color + "\">" + word + "</font>");
        }
        protected void Write(string word)
        {
            Response.Write(word);
        }
    }
    public class User
    {
        public long ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }
}

測試結果如下圖:

可以發現 fastJSON 速度領先另外兩個方法,但是字串較長!如果頻寬或儲存空間不足,可能使用 Json.NET 會比較好,最差的就是 JavaScriptSerializer 所以個人建議不要使用!


標籤:   .NET

我要留言