2013-11-22 29 views
4

我們通過TCP需要簡單基於文本的命令的TCP服務器上工作之間解析基準(類似的Redis)Golang:消息包和JSON

我們正在使用原始文本命令之間輾轉反側起來,JSON或消息包( http://msgpack.org/

的命令的一個例子可以是:

文本命令:LOCK some_random_key 1000

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

messagePack:\x83\xA7command\xA4LOCK\xA3key\xAFsome_random_key\xA7timeout\xCD\x03\xE8

問:

編輯:我想通了,我的問題是解析JSON和MsgPack之間的速度對比。請參閱我的回答中的結果

+0

你的問題不說,更重要的是,數據流的大小或可讀性,無論你是加密(SSL或任何否則)數據流(它們通常在加密前壓縮數據)等。我建議考慮「用戶」而不是「服務器」,記住如果有人需要閱讀你的JSON數據,他需要它是可讀的,如果它的機器與機器交談,壓縮 – nrathaus

回答

3

解析速度比較:

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 
} 
1

msgpack只承諾比JSON短,不是更快解析。在這兩種情況下,您的測試字符串非常簡短,您的基準測試可能只是測試特定實現的成熟度,而不是基礎算法。

如果你的所有消息真的都這麼短,解析速度可能是你的問題中最少的。我建議設計你的服務器,以便解析位易於替換,並實際分析代碼的行爲。

高德納作出以下聲明優化:

「我們應該忘記小的效率,講的時候約97%:過早的優化是所有罪惡的根源」

最後,如果你真的想知道發生了什麼,您需要剖析代碼。見

http://blog.golang.org/profiling-go-programs

對於如何與去配置文件代碼的例子。

0

而且,你的測試用例被顛倒 BenchmarkJSON實際上調用MsgPack 和 BenchmarkMsgPack調用的Json

能有什麼關係呢?

+0

是的!你是對的。感謝您的注意。我扭轉了它並將其作爲答案發布 – samol