4

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 の解析の速度比較である自分の質問を見つけました。私の答えで結果を見てください

4

4 に答える 4

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
}
于 2013-11-24T04:58:33.273 に答える
1

msgpack は、json よりも短いことを約束するだけで、解析が高速になることはありません。どちらの場合も、テスト文字列は非常に短く単純であるため、ベンチマークは、基礎となるアルゴリズムではなく、特定の実装の成熟度をテストするだけである可能性があります。

すべてのメッセージが実際にこれほど短い場合は、解析速度が問題になることはほとんどありません。解析ビットを簡単に交換できるようにサーバーを設計し、実際にコードをプロファイリングすることをお勧めします。

Donald Knuth は、最適化について次のように述べています。

「わずかな効率については忘れるべきです。たとえば、約 97% の確率で: 時期尚早の最適化は諸悪の根源です。」

最後に、何が起こっているのかを本当に知りたい場合は、コードをプロファイリングする必要があります。見る

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

go でコードをプロファイリングする方法の例。

于 2013-11-23T00:18:36.963 に答える
0

また、テスト ケースが逆になっている BenchmarkJSON は実際に MsgPack を呼び出し、BenchmarkMsgPack は Json を呼び出します

それは何か関係があるのでしょうか?

于 2013-11-23T05:14:11.277 に答える