2013-11-22 2 views
4

Мы работаем на сервере TCP, который принимает простые textbased команды через 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

Вопрос:

EDIT: я понял, мой собственный вопрос, который является сравнение скорости между парсинга 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

Я бы посоветовал сделать несколько тестов по типу данных, которые машины будут говорить друг с другом.

Я хотел бы предложить, чтобы попытаться Protocol Buffers (Encoding) + Snappy (сжатие)

1

msgpack только обещает быть короче, чем JSON, не быстрее разобрать. В обоих случаях ваша тестовая строка настолько короткая и простая, что ваш бенчмаркинг может просто проверять зрелость конкретной реализации, а не базовые алгоритмы.

Если все ваши сообщения действительно коротки, скорость анализа может быть наименьшей из ваших проблем. Я бы предложил создать ваш сервер таким образом, чтобы бит синтаксического анализа был легко заменен и фактически профилировал код в действии.

Дональд Кнут сделал следующее заявление по оптимизации:

«Мы должны забыть о небольших эффективности, скажем, около 97% времени: преждевременная оптимизация есть корень всех зол»

Наконец, если вы действительно хотите знать, что происходит, вам нужно профилировать код. См

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

для примера того, как профилировать код с ходу.

0

Кроме того, ваши тестовые случаи перепутаны BenchmarkJSON фактически вызывает MsgPack и BenchmarkMsgPack называет Json

мог, что что-то делать с этим?

+0

Да! Ты прав. Спасибо, что заметили это. Я отменил его и разместил в качестве ответа – samol

 Смежные вопросы

  • Нет связанных вопросов^_^