> On 9 Oct 2019, at 14:29, Sven Van Caekenberghe <s...@stfx.eu> wrote:
> 
> The size/speed/efficiency differences are minor for typical JSON payloads, 
> especially compared with compacted JSON. The implementation is simpler, 
> though, as there is no string escaping and no number parsing.
> 
> UBJSON is making a larger difference when dealing with arrays containing 
> numbers. Especially with ByteArrays, UBJSON makes a huge difference, since 
> these are essentially stored natively.

Here are some details/benchmarks.


1. A typical JSON payload


data := ZnConstants httpStatusCodes associations 
          collect: [ :each | { #code->each key. #reason->each value } 
asDictionary ].

[ NeoUBJSONWriter toByteArray: data ] bench. "'11108.114 per second'"

bytes := NeoUBJSONWriter toByteArray: data.

bytes size. "2290"

[ NeoUBJSONReader fromByteArray: bytes ] bench. "'4412.670 per second'"

[ NeoJSONWriter toString: data ] bench. "'11542.783 per second'"

json := NeoJSONWriter toString: data.

json size. "2358"

[ NeoJSONReader fromString: json ] bench. "'4814.711 per second'"


2. A 1K integer array


data := (1 to: 1024) asArray.

[ NeoUBJSONWriter toByteArray: data ] bench. "'6945.444 per second'"

bytes := NeoUBJSONWriter toByteArray: data.

bytes size. "2822"

[ NeoUBJSONReader fromByteArray: bytes ] bench. "'3280.632 per second'"

[ NeoJSONWriter toString: data ] bench. "'4523.095 per second'"

json := NeoJSONWriter toString: data.

json size. "4014"

[ NeoJSONReader fromString: json ] bench. "'1253.749 per second'"


3. A 1K byte array


data := ByteArray new: 1024 streamContents: [ :out | 
          1024 timesRepeat: [ out nextPut: 256 atRandom - 1 ] ].

[ NeoUBJSONWriter toByteArray: data ] bench. "'538493.501 per second'"

bytes := NeoUBJSONWriter toByteArray: data.

bytes size. "1031"

[ NeoUBJSONReader fromByteArray: bytes ] bench. "'216269.200 per second'"

[ NeoJSONWriter toString: data ] bench. "'4579.084 per second'"

json := NeoJSONWriter toString: data.

json size. "3686"

[ NeoJSONReader fromString: json ] bench. "'1297.362 per second'"


Right now, only ByteArray got a highly optimised implementation. In the future, 
FloatArray and IntegerArray could receive the same treatment.

Sven

PS:

Note that UBJSON is not the same as BSON, nor CBOR, nor MessagePack, which all 
exist in the same space.
 

Reply via email to