2016-07-07 23 views
0

Ich untersuche verschiedene Datenformat (String vs MASGPACK Byte), um JSON effizient zu kodieren und zu dekodieren. Die Jons, die ich erhalten werde, haben kein Schema, zumindest um es generisch zu halten, ich gehe davon aus, dass die Jons keinem bestimmten Schema folgen.Warum msgpack ist langsamer als json.parse?

Hier ist eine kleine JS Ich beurteile verwendet:

// 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); 
} 

Die Logik ist einfach: Ich habe die Länge des Arrays bin zu erhöhen und versuchen, die Zeit durch den Decoder genommen, um herauszufinden, um das Array zu dekodieren 10000 mal.

Zu meiner Überraschung nimmt msgpack 10 Mal mehr als json.parse. Zum Dekodieren des 100-Längen-Arrays benötigt msgpack 4694 ms, wohingegen json.parse nur 378 ms benötigt, obwohl msgpack das Array von 3602 Bytes auf 1303 Bytes komprimiert (vorausgesetzt, dass jedes Zeichen 2 Bytes benötigt).

Was ich ursprünglich angenommen habe, ist eine kleinere Größe zu decodieren würde bedeuten, dass kleinere Zeit zu entschlüsseln, aber es ist definitiv nicht der Fall. Irgendeine Idee warum? Sehen Sie irgendein Problem mit dem Programm, um msgpack auszuwerten?

Dank

Antwort

1

Sie beobachten diese Differenz, da JSON.parse native Implementierung unter der Motorhaube optimiert verwendet, während msgpack5 eine reine JS-Bibliothek ist. In anderen Sprachen (d. H. C, Java usw.) ist MsgPack in den meisten Situationen etwas schneller (siehe z. B. diesen Benchmark: https://github.com/eishay/jvm-serializers/wiki).

Es gibt nur wenige Fälle, in denen ein signifikanter Unterschied besteht. Zum Beispiel ist es wahrscheinlich, dass msgpack beim Serialisieren von Zahlen/Booleans schneller ist.

+0

Macht Sinn, danke, wissen Sie von Bibliotheken, die besser als JSON.parse im Allgemeinen? –

+0

@ShankhoneerChakrovarty Nein, ich weiß es nicht. Ich denke, jede Bibliothek, die das Add-on node.js als Back-End verwendet, wird ziemlich schnell sein. – Wildfire

Verwandte Themen