json - 戈朗 : Parsing benchmarking between message pack and JSON

标签 json go messagepack

我们正在开发一个 TCP 服务器,它通过 TCP 接收简单的基于文本的命令(类似于 redis)

我们在使用原始文本命令、JSON 或消息包 (http://msgpack.org/) 之间犹豫不决

一个命令的例子可以是:

文本命令:LOCK some_random_key 1000

JSON 命令:{"command":"LOCK","key":"some_random_key","timeout":1000}

消息包:\x83\xA7command\xA4LOCK\xA3key\xAFsome_random_key\xA7timeout\xCD\x03\xE8

问题:

编辑:我想出了我自己的问题,即解析 JSON 和 MsgPack 之间的速度比较。请在我的回答中查看结果

最佳答案

解析速度比较:

BenchmarkJSON     100000         17888 ns/op
BenchmarkMsgPack      200000         10432 ns/op

我的基准测试代码:

package benchmark

import (
    "encoding/json"
    "github.com/vmihailenco/msgpack"
    "testing"
)

var in = map[string]interface{}{"c": "LOCK", "k": "31uEbMgunupShBVTewXjtqbBv5MndwfXhb", "T/O": 1000, "max": 200}

func BenchmarkJSON(b *testing.B) {
    for i := 0; i < b.N; i++ {
        jsonB := EncodeJSON(in)
        DecodeJSON(jsonB)
    }
}

func BenchmarkMsgPack(b *testing.B) {
    for i := 0; i < b.N; i++ {
        b := EncodeMsgPack(in)
        DecodeMsgPack(b)
    }
}

func EncodeMsgPack(message map[string]interface{}) []byte {
    b, _ := msgpack.Marshal(message)
    return b
}

func DecodeMsgPack(b []byte) (out map[string]interface{}) {
    _ = msgpack.Unmarshal(b, &out)
    return
}

func EncodeJSON(message map[string]interface{}) []byte {
    b, _ := json.Marshal(message)
    return b
}

func DecodeJSON(b []byte) (out map[string]interface{}) {
    _ = json.Unmarshal(b, &out)
    return
}

关于json - 戈朗 : Parsing benchmarking between message pack and JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153020/

相关文章:

javascript - JSON 和 JavaScript - 如何使用 json 读取我的列表

javascript - 使用 $.ajax POST 将查询字符串参数传递给 WebService

python - ElasticSearch:TypeError:预期的字符串还是缓冲区?

go - 如何在 GoLang 的命令行上取消设置标志 Visited for Tests

c++ - cpp 的新手,如何运行 messagepack?

c - 消息包 C API

javascript - 如何从 Javascript 调用 MessagePack RPC 服务?

javascript - AngularJs json-formatter json 属性作为范围变量

在 TFS 构建创建中找不到 Go 语言模板

go - 为什么用指针分配接口(interface)然后分配地址在 Golang 中显示不同的行为