c# - 如何比较 messagepack-cli 和 json.net 反序列化器的性能?

标签 c# json serialization json.net msgpack

我正在尝试比较 Unity3d 中两种不同反序列化方法的性能,Unity3d 是基于 MonoDevelop 的 C#/.NET 实现

方法 A) 使用 MsgPack-CLI

方法 B) 使用 NewtonSoft's Json.NET

基于此blog post ,我的印象是 Messagepack 的读写速度会更快。但是,我发现虽然写入性能明显更好,但读取性能明显变慢。

为了测试反序列化性能,我在这段代码中做错了吗?

public void test_msgpack(int _num, Test_Class _obj)
{
    var serializer = MessagePackSerializer.Get< Test_Class >();
    var stream = new MemoryStream();

    serializer.Pack(stream, _obj);

    Stopwatch stopWatch = new Stopwatch ();
    stopWatch.Start ();
    while (_num > 0) {
        _num -= 1;
        stream.Position = 0;
        Test_Class deserializedObject = serializer.Unpack( stream );
    }

    stopWatch.Stop ();
    TimeSpan ts = stopWatch.Elapsed;
    string elapsedTime = String.Format ("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

    print ("msgpack read: " + elapsedTime);
}

public void test_json(int _num, Test_Class _obj)
{
    var serializer = new JsonSerializer();
    var stream = new MemoryStream();

    var sw = new StreamWriter(stream);
    var JsonTextWriter = new JsonTextWriter(sw);
    var sr = new StreamReader(stream);
    var JsonTextReader = new JsonTextReader(sr);

    serializer.Serialize(JsonTextWriter, _obj);

    Stopwatch stopWatch = new Stopwatch ();
    stopWatch.Start ();
    while (_num > 0) {
        _num -= 1;
        stream.Position = 0;
        Test_Class deserializedObject = serializer.Deserialize<Test_Class>(JsonTextReader);
    }
    stopWatch.Stop ();
    TimeSpan ts = stopWatch.Elapsed;
    string elapsedTime = String.Format ("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

    print ("json read: " + elapsedTime);
}

我发现 JSON 解析性能在 100000 次迭代中大约快 100 倍……这看起来很奇怪?这是我尝试序列化/反序列化的类的形式:

public class Test_Class
{
    public string i { get; set; }
    public List<float> a { get; set; }
    public List<float> b { get; set; }
    public List<float> c { get; set; }
}

最佳答案

经过反复试验,我发现 JSON.net 代码返回了一个空对象,因此性能显着提高。我通过如下修改 test_json 方法来解决这个问题:

public void test_json(int _num, Test_Class _obj)
{
    JsonSerializer serializer = new JsonSerializer();

    MemoryStream stream = new MemoryStream();

    StreamWriter writer = new StreamWriter(stream);
    JsonTextWriter jsonWriter = new JsonTextWriter(writer);
    serializer.Serialize(jsonWriter, _obj);
    jsonWriter.Flush();

    Stopwatch stopWatch = new Stopwatch ();
    stopWatch.Start ();
    while (_num > 0) {
        _num -= 1;
        stream.Position = 0;

        StreamReader reader = new StreamReader(stream);
        JsonTextReader jsonReader = new JsonTextReader(reader);
        Test_Class deserialised_object = serializer.Deserialize<Test_Class>(jsonReader);
    }
    stopWatch.Stop ();
    TimeSpan ts = stopWatch.Elapsed;
    string elapsedTime = String.Format ("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);

    print ("json read: " + elapsedTime);
}

jsonWriter.Flush() 方法是必需的,每次读取时都需要创建一个新的 JsonTextReader。

结果仍然显示 JSON.net 在反序列化时速度更快,但是,这种差异现在更小了。 MsgPack-CLI 的性能显然可以通过使用 SerializerGenerator 类来提高,尽管我还没有实现。

关于c# - 如何比较 messagepack-cli 和 json.net 反序列化器的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232674/

相关文章:

c# - .NET 中的 DeflateStream 4GB 限制

c# - Linq to sql/C# - 多处搜索键/值对

c# - 大于/小于符号(例如 Action<List<X>>)在 C# 中意味着什么?

c# - 如何在Winform中输入韩文?

javascript - 跨源资源共享和文件 ://

java - 如何为自定义 Jackson Serializer 编写 JUnit 测试?

javascript:如何将 Uint8Array 数据转换为 JS 对象

javascript - 代码以错误的顺序执行

c++ - 是否可以在 C++ 中序列化和反序列化一个类?

python - 如何在事后方便地修改 matplotlib 图(持久化/序列化)?