2016-07-07 5 views
0

Я изучаю другой формат данных (string vs masgpack byte) для эффективного кодирования и декодирования json. Jsons, которые я получаю, не имеют какой-либо схемы, по крайней мере, чтобы сохранить ее универсальной, я предполагаю, что jsons не следуют какой-либо конкретной схеме.Почему msgpack медленнее json.parse?

Вот небольшой JS Я использовал для оценки:

// skip-eslint 
var msgpack = require('msgpack5')() // namespace our extensions 
    , encode = msgpack.encode 
    , decode = msgpack.decode; 

var helloWorldObj = { 'hello': 'world' }; 
var json = []; 

var MAX_DECODE_REPEAT = 10000; 
var MAX_REPEAT = 100; 

console.log('json,data,time'); 
//msgpack 
for (var i=0;i<MAX_REPEAT;i++) { 
    json = []; 
    // create i+1 length json array 
    for(var k=0;k<=i;k++){ 
    json.push(helloWorldObj); 
    } 

    // encode the json array 
    var encodedJson = encode(json); 
    var start = new Date().getTime(); 
    // start decoding =>msgpack 
    for(var count=0;count<MAX_DECODE_REPEAT;count++){ 
    decode(encodedJson); 
    } 
    var end = new Date().getTime(); 
    var time = end-start; 
    console.log(json.length +',' + encodedJson.length + ','+time); 

} 

// JSON.parse 
for (var i=0;i<MAX_REPEAT;i++) { 
    json = []; 
    // create i+1 length json array 
    for(var k=0;k<=i;k++){ 
    json.push(helloWorldObj); 
    } 

    // stringify the json array 
    var jsonString = JSON.stringify(json); 
    var start = new Date().getTime(); 
    // start decoding =>msgpack 
    for(var count=0;count<MAX_DECODE_REPEAT;count++){ 
    JSON.parse(jsonString); 
    } 
    end = new Date().getTime(); 
    time = end-start; 
    console.log(json.length +',' + jsonString.length*2 + ','+time); 
} 

Логика проста: я увеличивая длину массива и пытается выяснить, время, затраченное на декодер для декодирования массива 10000 раз.

К моему удивлению, msgpack принимает в 10 раз больше, чем json.parse. Чтобы декодировать 100-разрядный массив, msgpack занимает 4694 мс, тогда как json.parse занимает всего 378 мс, хотя msgpack сжимает массив до 1303 байтов из 3602 байтов (при условии, что каждый символ занимает 2 байта).

Первоначально предполагалось, что размер меньшего размера для декодирования означает меньшее время для декодирования, но его определенно не так. Любая идея почему? Вы видите какую-либо проблему с программой для оценки msgpack?

Благодаря

ответ

1

вы наблюдаете эту разницу, потому что JSON.parse использует оптимизированную реализацию родной под капотом, в то время как msgpack5 библиотека чисто JS. На других языках (например, C, Java и т. Д.) MsgPack будет немного быстрее в большинстве ситуаций (например, см. Этот тест: https://github.com/eishay/jvm-serializers/wiki).

Есть несколько угловых случаев, когда будет значительная разница. Например, вполне вероятно, что msgpack будет быстрее при сериализации чисел/булевых.

+0

Имеет смысл, спасибо, знаете ли вы о каких-либо библиотеках, которые лучше, чем JSON.parse вообще? –

+0

@ShankhoneerChakrovarty Нет, я не знаю. Я предполагаю, что любая библиотека, которая использует дополнение node.js в качестве back-end, будет довольно быстрой. – Wildfire