Warum ist JSON schneller als BSON-in node.js?
Nach der Lektüre diese, es ist ein Zitat, das in Erinnerung geblieben:
BSON ist auch entworfen, um schnell zu codieren und zu decodieren. Zum Beispiel Ganzzahlen gespeichert sind, als 32 (oder 64) - bit-Integer, so dass Sie nicht brauchen, um analysiert zu werden und aus dem text. Dieses benötigt mehr Platz als das JSON-für kleine Ganzzahlen, aber ist viel schneller zu analysieren.
Von dem, was ich lese, wird der gesamte Punkt, der mit BSON ist, weil es weniger anstrengend für die CPU und schneller zu Kodieren/Prozess.
Aber, ich habe einige tests mit Node.js und mit einer nativen JSON-Ansatz bläst BSON aus dem Wasser. Einige tests zeigen JSON ist etwa 3 bis 5 mal schneller. (Und um 6, um 8, wenn mehr Daten-Typen.)
Benchmark-Code:
var bson = require('bson');
var BSON = new bson.BSONPure.BSON();
var os = require('os');
console.log(" OS: " + os.type() + " " + os.release() + " (" + os.arch() + ")");
console.log("RAM: " + os.totalmem() / 1048576 + " MB (total), " + os.freemem() / 1048576 + " MB (free)");
console.log("CPU: " + os.cpus()[0].speed + " MHz " + os.cpus()[0].model);
for (var r = 1; r < 4; r++) {
console.log("\nRun #" + r + ":");
var obj = {
'abcdef': 1,
'qqq': 13,
'19': [1, 2, 3, 4]
};
var start = Date.now();
for (var i = 0; i < 500000; i++) {
JSON.parse(JSON.stringify(obj));
}
var stop = Date.now();
console.log("\t JSON: " + (stop - start) + " ms");
start = Date.now();
for (var i = 0; i < 500000; i++) {
BSON.deserialize(BSON.serialize(obj));
}
stop = Date.now();
console.log("\t Bson: " + (stop - start) + " ms");
}
Ergebnisse:
OS: Windows_NT 6.1.7601 (x64)
RAM: 8174.1171875 MB (total), 5105.03515625 MB (free)
CPU: 3515 MHz AMD FX(tm)-6300 Six-Core Processor
Run #1:
JSON: 1820 ms
Bson: 8639 ms
Run #2:
JSON: 1890 ms
Bson: 8627 ms
Run #3:
JSON: 1882 ms
Bson: 8692 ms
Mit dieser sagte, ich bin auf der Suche nach einem binären Ansatz zum senden und empfangen von Daten mittels websockets. Und BSON funktioniert dies perfekt, aber beim Blick auf die benchmark-Ergebnisse, wie kann BSON-weniger anstrengend für die CPU, wenn es länger dauert, zu serialisieren /Deserialisieren von Objekten?
Tut BSON-make-up für den extra CPU-Auslastung nutzt es, da gibt es keine Konvertierung zu UTF-8 mit text basiert websockets? Würde das Niveau der Leistung in diesem Zusammenhang?
@Joe Clay unten, hier die Ergebnisse für stringify
und serializing
nur:
Run #1:
JSON: 922 ms
Bson: 355 5ms
- Hm, haben Sie versucht, die Prüfung der Serialisierung und der Deserialisierung getrennt? Die Formulierung von "viel schneller zu analysieren" macht mich Frage mich, ob es ist die Serialisierung, dass die BSON-benchmark, so viel langsamer ist, anstatt es einfach insgesamt langsamer.
- Hast du auch installieren
bson-ext
, damit Sie vergleichen native Implementierungen der beiden JSON und BSON? Ansonsten hast du den Vergleich zu einem rein JS BSON-Implementierung gegen eine native JSON-Implementierung. - Gute Idee, ich habe diese tests auf meinen post
- Oh, nee. oops...
- Guter Punkt, nicht der Meinung, dass.
- Ich denke, sollten Sie den test erneut mit einem
Buffer
Objekt eine der Eigenschaften des prüfobjekts. Dann denke ich, Sie werden sehen, wo BSON scheint.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage sollte nicht sein Warum ist JSON schneller als BSON? aber Warum ist JSON schneller als BSON-in node.js?.
In den meisten Umgebungen binäre Codierungen wie BSON, MessagePack oder CBOR wäre leichter zu Kodieren als die textuelle JSON-Kodierung. Allerdings javascript-Umgebungen (wie v8/node.js) sind stark optimiert für die JSON-Handhabung (weil es eine Teilmenge von javascript). JSON-de/encoding wird wohl umgesetzt, da in nativen code im optimized Mode direkt in der JS-VM. Die javascript-VMs sind jedoch nicht optimiert für die Darstellung und Manipulation von byte-arrays (welches von einem BSON-Bibliothek). Knoten systemeigenen Puffer Typ könnte besser sein, als eine Reine JS-array, aber mit ihm arbeiten (und das tun z.B. die JS string (UTF16) -> byte-UTF8-Dekodierung in JS) ist noch langsamer als der eingebaute JSON-Serialisierung.
In anderen Sprachen, wie C++ mit direktem byte-array zugreifen und utf8-string-Typen die Ergebnisse könnten ganz anders sein.
Glaube ich Node.js und die meisten Browser sind die Ausnahme.
Ist die einfache Antwort der JSON-parser/serializer/deserializer (also V8) sind extrem optimiert und sind geschrieben in C/C++. Die BSON-parser ist in JavaScript geschrieben. Aber selbst wenn der parser geschrieben nativen (und ich glaube, BSON hat) JSON noch gewinnen wahrscheinlich, gegeben, wie optimierte V8 ist für JSON.
Wenn du eine Plattform wie Java oder C# die BSON-format ist wahrscheinlich schneller.
Siehe @Matthais247 wer beantwortet mir nach, aber viel mehr vollständig.
Denke ich, kann man nicht beurteilen, die Leistung nur durch betrachten serialise/Deserialisieren. Sie haben einfach falsch entschieden use-case für BSON. BSON glänzt in Datenbanken - wo können Sie das tun, sind die Berechnungen auf die Daten, ohne die Notwendigkeit, zu serialisieren. Auch das speichern und abrufen von binären Daten wie Bilder macht BSON effizienter, da Sie nicht brauchen, um die Verschlüsselung der Daten als Hex/BASE64 oder ähnliches.
Versuchen, einige Berechnungen direkt abrufen/speichern der Werte in JSON und BSON. Aber random access (nicht immer die gleichen Artikel), so dass die chance, es wird optimiert unter der Haube ist klein.