BSON
@deepkit/bson
is a high-performance TS implementation of a parser and serializer for BSON,
the MongoDB Binary JSON format. It's the fastest JS BSON parser, even faster than native JSON.parse/stringify.
Deepkit has reimplemented it because it's a high-performance framework and both the official JS (js-bson) and C++ (bson-ext) packages are too slow.
How slow? When converting 10k elements in an array, js-bson takes 25ms, bson-ext takes 31ms, whiles JSON.parse takes only 5ms.
This makes the official BSON parser 5x slower than native JSON.parse. deepkit/type-bson on the other hand takes only 2ms and is therefore 13x faster.
Benchmark
Parsing BSON buffer that contains an array with 10k objects.
Method | Time (ms) |
---|
official native bson-ext | 31ms |
official js-bson | 25ms |
deepkit/bson generic v2 | 6ms |
deepkit/bson generic v3 | 4ms |
JSON.parse | 5ms |
deepkit/type JIT | 2ms |
Serializing an array with 10k objects.
Method | Time (ms) |
---|
official native bson-ext | 39ms |
official js-bson | 33ms |
JSON.stringify | 5ms |
deepkit/bson JIT | 2ms |
"deepkit/bson JIT" means a parser/serializer based on a schema like so:
import {t} from '@deepkit/type';
import {getBSONDecoder} from '@deepkit/bson';
interface Model {
username: string;
tags: string[];
priority: number;
}
const decoder = getBSONDecoder<Model>();
const bson = new Buffer([]);
const document = decoder(bson);
whereas "deepkit/type generic" means schema-less:
import {parseObject, ParserV2, ParserV3} from '@deepkit/bson';
const bson = new Buffer([]);
const object1 = parseObject(new ParserV2(bson));
const object2 = parseObject(new ParserV3(bson));
Differences
There are a couple of differences to the official serializer.
- ObjectId is deserialized as string.
- UUID is deserialized as string.
- BigInt is supported and serialized as long.
- Unlimited size BigInt supported (serialised as binary)
- Long is deserialized as BigInt.