Advertisement
romanilyin

Unity JSON Test

Feb 14th, 2022
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.64 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using System.Text;
  5.  
  6. using UnityEngine;
  7.  
  8. using LitJson;
  9. using Newtonsoft.Json;
  10. using Tiny;
  11. using Sirenix.Serialization;
  12.  
  13. [Serializable]
  14. public class EmptyClass
  15. {
  16. }
  17.  
  18. [Serializable]
  19. public class StringOnly
  20. {
  21.     public string String;
  22. }
  23.  
  24. [Serializable]
  25. public class ArrayOnly
  26. {
  27.     public int[] IntArray;
  28. }
  29.  
  30. [Serializable]
  31. public class A
  32. {
  33.     public B B;
  34. }
  35.  
  36. [Serializable]
  37. public class B
  38. {
  39.     public C C;
  40. }
  41.  
  42. [Serializable]
  43. public class C
  44. {
  45.     public D D;
  46. }
  47.  
  48. [Serializable]
  49. public class D
  50. {
  51.     public E E;
  52. }
  53.  
  54. [Serializable]
  55. public class E
  56. {
  57.     public F F;
  58. }
  59.  
  60. [Serializable]
  61. public class F
  62. {
  63.     public G G;
  64. }
  65.  
  66. [Serializable]
  67. public class G
  68. {
  69.     public H H;
  70. }
  71.  
  72. [Serializable]
  73. public class H
  74. {
  75.     public I I;
  76. }
  77.  
  78. [Serializable]
  79. public class I
  80. {
  81.     public int Val;
  82. }
  83.  
  84.  
  85.  
  86. class TestScript : MonoBehaviour
  87. {
  88.     string _report = "";
  89.  
  90.     void Start ()
  91.     {
  92.         var emptyClass = new EmptyClass();
  93.         var smallString = new StringOnly { String = "hey" };
  94.         var largeString = new StringOnly { String = new string('*', 100000) };
  95.         var smallArray = new ArrayOnly { IntArray = new[] { 1, 2, 3 } };
  96.         var largeArray = new ArrayOnly { IntArray = new int[1000] };
  97.         var shallowNestedObject = new A { B = new B { C = new C() { } } };
  98.         var deepNestedObject = new A
  99.         {
  100.             B = new B
  101.             {
  102.                 C = new C
  103.                 {
  104.                     D = new D
  105.                     {
  106.                         E = new E
  107.                         {
  108.                             F = new F
  109.                             {
  110.                                 G = new G
  111.                                 {
  112.                                     H = new H
  113.                                     {
  114.                                         I = new I { Val = 123 }
  115.                                     }
  116.                                 }
  117.                             }
  118.                         }
  119.                     }
  120.                 }
  121.             }
  122.         };
  123.         Test("Empty Class", emptyClass, 100000);
  124.         Test("Small String", smallString, 10000);
  125.         Test("Large String", largeString, 1000);
  126.         Test("Small Array", smallArray, 100000);
  127.         Test("Large Array", largeArray, 1000);
  128.         Test("Shallow Nested Object", shallowNestedObject, 10000);
  129.         Test("Deep Nested Object", deepNestedObject, 10000);
  130.     }
  131.  
  132.     void Test<T> (string label, T obj, int reps)
  133.         where T : class
  134.     {
  135.         // Warm up reflection
  136.         JsonUtility.ToJson(obj);
  137.         LitJson.JsonMapper.ToJson(obj);
  138.         JsonConvert.SerializeObject(obj);
  139.         Tiny.Json.Encode(obj);
  140.         SerializationUtility.SerializeValue(obj, DataFormat.JSON);
  141.  
  142.         var stopwatch = new System.Diagnostics.Stopwatch();
  143.         string unityJson = null;
  144.         string litJsonJson = null;
  145.         string jsonDotNetJson = null;
  146.         string tinyJson = null;
  147.         byte[] odinJson = null;
  148.  
  149.         T unityObj = null;
  150.         T litJsonObj = null;
  151.         T jsonDotNetObj = null;
  152.         T tinyJsonObj = null;
  153.         T odinObj = null;
  154.  
  155.         stopwatch.Start();
  156.         for ( var i = 0; i < reps; ++i )
  157.         {
  158.             unityJson = JsonUtility.ToJson(obj);
  159.         }
  160.         var unitySerializeTime = stopwatch.ElapsedMilliseconds;
  161.  
  162.         stopwatch.Reset();
  163.         stopwatch.Start();
  164.         for ( var i = 0; i < reps; ++i )
  165.         {
  166.             litJsonJson = LitJson.JsonMapper.ToJson(obj);
  167.         }
  168.         var litJsonSerializeTime = stopwatch.ElapsedMilliseconds;
  169.  
  170.         stopwatch.Reset();
  171.         stopwatch.Start();
  172.         for ( var i = 0; i < reps; ++i )
  173.         {
  174.             tinyJson = Tiny.Json.Encode(obj);
  175.         }
  176.         var tinyJsonSerializeTime = stopwatch.ElapsedMilliseconds;
  177.         stopwatch.Reset();
  178.         stopwatch.Start();
  179.         for ( var i = 0; i < reps; ++i )
  180.         {
  181.             jsonDotNetJson = JsonConvert.SerializeObject(obj);
  182.         }
  183.         var jsonDotNetSerializeTime = stopwatch.ElapsedMilliseconds;
  184.         stopwatch.Reset();
  185.         stopwatch.Start();
  186.         for (var i = 0; i < reps; ++i)
  187.         {
  188.             odinJson = SerializationUtility.SerializeValue(obj, DataFormat.JSON);
  189.         }
  190.         var odinSerializeTime = stopwatch.ElapsedMilliseconds;
  191.  
  192.  
  193.         stopwatch.Reset();
  194.         stopwatch.Start();
  195.         for ( var i = 0; i < reps; ++i )
  196.         {
  197.             unityObj = JsonUtility.FromJson<T>(unityJson);
  198.         }
  199.         var unityDeserializeTime = stopwatch.ElapsedMilliseconds;
  200.  
  201.         stopwatch.Reset();
  202.         stopwatch.Start();
  203.         for ( var i = 0; i < reps; ++i )
  204.         {
  205.             litJsonObj = LitJson.JsonMapper.ToObject<T>(litJsonJson);
  206.         }
  207.         var litJsonDeserializeTime = stopwatch.ElapsedMilliseconds;
  208.  
  209.         stopwatch.Reset();
  210.         stopwatch.Start();
  211.         for ( var i = 0; i < reps; ++i )
  212.         {
  213.             tinyJsonObj = Tiny.Json.Decode<T>(tinyJson);
  214.         }
  215.         var tinyJsonDeserializeTime = stopwatch.ElapsedMilliseconds;
  216.  
  217.         stopwatch.Reset();
  218.         stopwatch.Start();
  219.         for ( var i = 0; i < reps; ++i )
  220.         {
  221.             jsonDotNetObj = JsonConvert.DeserializeObject<T>(jsonDotNetJson);
  222.         }
  223.         var jsonDotNetDeserializeTime = stopwatch.ElapsedMilliseconds;
  224.  
  225.         stopwatch.Reset();
  226.         stopwatch.Start();
  227.         for (var i = 0; i < reps; ++i)
  228.         {
  229.             odinObj = SerializationUtility.DeserializeValue<T>(odinJson, DataFormat.JSON);
  230.         }
  231.         var odinDeserializeTime = stopwatch.ElapsedMilliseconds;
  232.  
  233.         var unitySize = Encoding.UTF8.GetBytes(unityJson).Length;
  234.         var litJsonSize = Encoding.UTF8.GetBytes(litJsonJson).Length;
  235.         var jsonDotNetSize = Encoding.UTF8.GetBytes(jsonDotNetJson).Length;
  236.         var tinyJsonSize = Encoding.UTF8.GetBytes(tinyJson).Length;
  237.         var odinSize = odinJson.Length;
  238.  
  239.         var msg = string.Format(
  240.             "{0} ({1} reps)\n" +
  241.             "Library,\tSize,\tSerializeTime,\tDeserialize Time\n" +
  242.             "Unity,\t{2},\t{3},\t\t{4}\n" +
  243.             "LitJSON,\t{5},\t{6},\t\t{7}\n" +
  244.             "Json.NET,\t{8},\t{9},\t\t{10}\n" +
  245.             "TinyJson,\t{11},\t{12},\t\t{13}\n" +
  246.             "Odin,\t{14},\t{15},\t\t{16}\n",
  247.             label, reps,
  248.             unitySize, unitySerializeTime, unityDeserializeTime,
  249.             litJsonSize, litJsonSerializeTime, litJsonDeserializeTime,
  250.             jsonDotNetSize, jsonDotNetSerializeTime, jsonDotNetDeserializeTime,
  251.             tinyJsonSize,tinyJsonSerializeTime,tinyJsonDeserializeTime,
  252.             odinSize, odinSerializeTime, odinDeserializeTime
  253.         );
  254.         _report += msg;
  255.     }
  256.  
  257.     void OnGUI ()
  258.     {
  259.         GUI.TextArea(new Rect(0, 0, Screen.width, Screen.height), _report);
  260.     }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement