I would like to use MessagePack to speed up API communication.
See how different serialization de-serialization speeds are
Using MessagePack and JSON,
We are comparing the speed using the following process.
■add
There was an error in the measurement, so the source code was rewritten and the measurement value was re-measured
Add size after serialization
Data creation→Time measurement→Serialization→Time measurement→Decialization→Time measurement
■MsgPack used
https://github.com/msgpack/msgpack-cli/releases
Expand the zip file in the above URL version 0.62 and
You are using MsgPack.dll located in the unity3d folder.
■Json
withMiniJSON
■Testcase
1—
(average serialized list of ints from 0 to 10000 100 times)
Check it out on the actual Android device
2:
(average serialized list of strings from 0 to 10000 100 times)
Check it out on the actual Android device
■Test Results
■Case 1
MsgPack (Array):
Bytes after serialization: 29747
serialization time: 24.6 msec
Deserialization time: 165.2 msec
Json:
Bytes after serialization: 48891
serialization time: 31.1 msec
Deserialization time: 74.7 msec
■ Case 2
MsgPack (Array):
Bytes after serialization: 48893
serialization time: 37.6 msec
Deserialization time: 277.0 msec
Json:
Bytes after serialization: 68891
serialization time: 22.2 msec
Deserialization time: 57.5 msec
■source code
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using System.Collections.General;
using MiniJSON;
using MsgPack;
using MsgPack.Serialization;
using System.Linq;
public class MsgPackAndJsonCompare:MonoBehavior {
public int SampleCount = 100;
private string MsgLog="";
private int SampleIndex = 0;
List<long>ArrayListLong=new List<long>();;
List<string>ArrayListString=new List<string>();
/// <summary>
/// int data creation process
/// </summary>
public void OnClickArrayInt()
{
for (inti=0; i<10000;i++)
{
ArrayListLong.Add(i);
}
Debug.Log("OnClickArrayIntEnd");
}
/// <summary>
/// String data creation processing
/// </summary>
public void OnClickArrayString()
{
for (inti=0; i<10000;i++)
{
ArrayListString.Add(i.ToString());
}
Debug.Log("OnClickArrayString End";
}
/// <summary>
/// Test start looping 100 times
/// </summary>
/// <param name="sendMode"></param>
public void OnClickCompare (int sendMode)
{
SampleIndex=0;
for (inti=SampleIndex;i<SampleCount;i++)
{
MsgLog=MsgLog+", LoopCnt="+i.ToString();
MsgLog=MsgLog+", StartTime="+DateTime.Now.Ticks.ToString();
MainFunc (sendMode);
MsgLog=MsgLog+", EndTime="+DateTime.Now.Ticks.ToString()+"\n";
}
Debug.Log("Function End");
}
/// <summary>
/// main processing
/// </summary>
/// <param name="compareMode"></param>
private void MainFunc (int compareMode)
{
// ArrayInt - MsgPack
if(compareMode==0)
{
MsgLog=MsgLog+", serialize StartTime="+DateTime.Now.Ticks.ToString();
varstream=new MemoryStream();
// Create serializer instance.
varserializer=MessagePackSerializer.Get<List<long>>();
serializer.Pack (stream, ArrayListLong);
// long datalen=stream.Length;
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
stream.Position=0;
List<long>deserializedObject=serializer.Unpack(stream);
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
}
// ArrayInt - Json
else if (compareMode==1)
{
MsgLog=MsgLog+", serialize StartTime="+DateTime.Now.Ticks.ToString();
string serialized = Json.Serialize (ArrayListLong);
intilenb=System.Text.Encoding.GetEncoding(65001).GetByteCount(serialized);
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
List<System.Object>deserializedDoubleList=Json.Deserialize(serialized) as List<System.Object>;
List<long>longList=deserializedDoubleList.OfType<long>().ToList();
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
}
// ArrayString - MsgPack
else if (compareMode==2)
{
MsgLog=MsgLog+", serialize StartTime="+DateTime.Now.Ticks.ToString();
varstream=new MemoryStream();
// Create serializer instance.
varserializer=MessagePackSerializer.Get<List<string>>();
serializer.Pack (stream, ArrayListString);
long datalen=stream.Length;
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
stream.Position=0;
List<string>deserializedObject=serializer.Unpack(stream);
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
}
// ArrayString - Json
else if (compareMode==3)
{
MsgLog=MsgLog+", serialize StartTime="+DateTime.Now.Ticks.ToString();
string serialized = Json.Serialize (ArrayListString);
intilenb=System.Text.Encoding.GetEncoding(65001).GetByteCount(serialized);
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
List<System.Object>deserializedDoubleList=Json.Deserialize(serialized) as List<System.Object>;
List<string>longList=deserializedDoubleList.OfType<string>().ToList();
MsgLog=MsgLog+", serialize EndTime="+DateTime.Now.Ticks.ToString();
}
}
public void OnclickLog()
{
StartCoroutine (LogDisp());
}
IEnumerator LogDisp()
{
string[]LogArray=MsgLog.Split('\n');
int maxloop = LogArray.Length;
inti = 0;
while(i<maxloop)
{
Debug.Log("Log="+LogArray[i]);
yield return 0;
i++;
}
}
■Problems
It says that MessagePack is faster when you collect information on the Internet.
I see a lot of them, but my source is
more than I do with MessagePack.
JSON is faster, so I suspect it's the wrong way.
Serialization is the conversion of input data into binary, etc.
Decimalization is the opposite of binary and so on.
MessagePackSerializer
serializes List<int>
and decalizes it to List<int>
.
However, while Json.Serialize
serializes List<int>
, Json.Deserialize
has not returned to List<int>
, only decoding the JSON string (is it returned?)
Therefore, it is not an equal comparison.
It doesn't seem to be understood at all, so I'll add it.
MessagePackSerializer
supports any type if the conditions are met.For example,
public structure Color{
public int R;
public int G;
public int B;
public override string ToString() {return "Hoge";}
}
interprets the type, serializes the public properties, and returns a restore of each property value during de-serialization.
For MiniJSON
does not maintain the type.Serialize ToString() results for unknown types, and de-serialize numbers to double
or int64
.
As a result, if you serialize Color
above in MiniJSON
, the JSON string will be "Hoge"
, and you can only get the string when you de-serialize it.
Therefore, it is not an equal comparison.
© 2024 OneMinuteCode. All rights reserved.