2016-07-07 166 views
0

我正在研究不同的數據格式(字符串vs masgpack字節)以有效地對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); 
} 

的邏輯很簡單:我增加陣列的長度,並試圖找出到陣列解碼由解碼器所用的時間萬倍。

令我驚訝的是,msgpack比json.parse多了10倍。解碼100個長度數組msgpack需要4694毫秒,而json.parse僅需要378毫秒,即使msgpack將數組從3602個字節壓縮到1303個字節(假定每個字符需要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插件作爲後端的庫都會很快。 – Wildfire