From fb6078799002ea22a510b45f64f0be57dde858df Mon Sep 17 00:00:00 2001 From: miloyip Date: Thu, 2 Apr 2015 15:01:06 +0800 Subject: [PATCH] Update internals --- doc/diagram/architecture.dot | 50 ++++++++ doc/diagram/architecture.png | Bin 0 -> 10989 bytes doc/diagram/utilityclass.dot | 73 ++++++++++++ doc/diagram/utilityclass.png | Bin 0 -> 62311 bytes doc/internals.md | 214 ++++++++++++++++++++++++++++++++++- 5 files changed, 335 insertions(+), 2 deletions(-) create mode 100644 doc/diagram/architecture.dot create mode 100644 doc/diagram/architecture.png create mode 100644 doc/diagram/utilityclass.dot create mode 100644 doc/diagram/utilityclass.png diff --git a/doc/diagram/architecture.dot b/doc/diagram/architecture.dot new file mode 100644 index 0000000..c816c87 --- /dev/null +++ b/doc/diagram/architecture.dot @@ -0,0 +1,50 @@ +digraph { + compound=true + fontname="Inconsolata, Consolas" + fontsize=10 + margin="0,0" + ranksep=0.2 + nodesep=0.5 + penwidth=0.5 + colorscheme=spectral7 + + node [shape=box, fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5, style=filled, fillcolor=white] + edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] + + subgraph cluster1 { + margin="10,10" + labeljust="left" + label = "SAX" + style=filled + fillcolor=6 + + Reader -> Writer [style=invis] + } + + subgraph cluster2 { + margin="10,10" + labeljust="left" + label = "DOM" + style=filled + fillcolor=7 + + Value + Document + } + + Handler [label="<>\nHandler"] + + { + edge [arrowtail=onormal, dir=back] + Value -> Document + Handler -> Document + Handler -> Writer + } + + { + edge [arrowhead=vee, style=dashed, constraint=false] + Reader -> Handler [label="calls"] + Value -> Handler [label="calls"] + Document -> Reader [label="uses"] + } +} \ No newline at end of file diff --git a/doc/diagram/architecture.png b/doc/diagram/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..05336df04563de8c57ad4bfda33560052a037519 GIT binary patch literal 10989 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 QV-%qzuP#?CWAf^M0geNLSpWb4 literal 0 HcmV?d00001 diff --git a/doc/diagram/utilityclass.dot b/doc/diagram/utilityclass.dot new file mode 100644 index 0000000..1492a8a --- /dev/null +++ b/doc/diagram/utilityclass.dot @@ -0,0 +1,73 @@ +digraph { + rankdir=LR + compound=true + fontname="Inconsolata, Consolas" + fontsize=10 + margin="0,0" + ranksep=0.3 + nodesep=0.15 + penwidth=0.5 + colorscheme=spectral7 + + node [shape=box, fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5, style=filled, fillcolor=white] + edge [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] + + subgraph cluster0 { + style=filled + fillcolor=4 + + Encoding [label="<>\nEncoding"] + + edge [arrowtail=onormal, dir=back] + Encoding -> { UTF8; UTF16; UTF32; ASCII; AutoUTF } + UTF16 -> { UTF16LE; UTF16BE } + UTF32 -> { UTF32LE; UTF32BE } + } + + subgraph cluster1 { + style=filled + fillcolor=5 + + Stream [label="<>\nStream"] + InputByteStream [label="<>\nInputByteStream"] + OutputByteStream [label="<>\nOutputByteStream"] + + edge [arrowtail=onormal, dir=back] + Stream -> { + StringStream; InsituStringStream; StringBuffer; + EncodedInputStream; EncodedOutputStream; + AutoUTFInputStream; AutoUTFOutputStream + InputByteStream; OutputByteStream + } + + InputByteStream -> { MemoryStream; FlieReadStream } + OutputByteStream -> { MemoryBuffer; FileWriteStream } + } + + subgraph cluster2 { + style=filled + fillcolor=3 + + Allocator [label="<>\nAllocator"] + + edge [arrowtail=onormal, dir=back] + Allocator -> { CrtAllocator; MemoryPoolAllocator } + } + + { + edge [arrowtail=odiamond, arrowhead=vee, dir=both] + EncodedInputStream -> InputByteStream + EncodedOutputStream -> OutputByteStream + AutoUTFInputStream -> InputByteStream + AutoUTFOutputStream -> OutputByteStream + MemoryPoolAllocator -> Allocator [label="base", tailport=s] + } + + { + edge [arrowhead=vee, style=dashed] + AutoUTFInputStream -> AutoUTF + AutoUTFOutputStream -> AutoUTF + } + + //UTF32LE -> Stream [style=invis] +} \ No newline at end of file diff --git a/doc/diagram/utilityclass.png b/doc/diagram/utilityclass.png new file mode 100644 index 0000000000000000000000000000000000000000..0088bb15bcef3d9a4b1cdbaa13a52cc2d74aae47 GIT binary patch literal 62311 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≠7CLtFZXzPR3JT2qZ#d*^AhDE%#Svy531j83mDg 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 literal 0 HcmV?d00001 diff --git a/doc/internals.md b/doc/internals.md index da60825..a20c014 100644 --- a/doc/internals.md +++ b/doc/internals.md @@ -4,24 +4,234 @@ This section records some design and implementation details. [TOC] +# Architecture {#Architecture} + +## SAX and DOM + +The basic relationships of SAX and DOM is shown in the following UML diagram. + +![Architecture UML class diagram](diagram/architecture.png) + +The core of the relationship is the `Handler` concept. From the SAX side, `Reader` parses a JSON from a stream and publish events to a `Handler`. `Writer` implements the `Handler` concept to handle the same set of events. From the DOM side, `Document` implements the `Handler` concept to build a DOM according to the events. `Value` supports a `Value::Accept(Handler&)` function, which traverses the DOM to publish events. + +With this design, SAX is not dependent on DOM. Even `Reader` and `Writer` have no dependencies between them. This provides flexibility to chain event publisher and handlers. Besides, `Value` does not depends on SAX as well. So, in addition to stringify a DOM to JSON, user may also stringify it to a XML writer, or do anything else. + +## Utility Classes + +Both SAX and DOM APIs depends on 3 additional concepts: `Allocator`, `Encoding` and `Stream`. Their inheritance hierarchy is shown as below. + +![Utility classes UML class diagram](diagram/utilityclass.png) + # Value {#Value} +`Value` (actually a typedef of `GenericValue>`) is the core of DOM API. This section describes the design of it. + ## Data Layout {#DataLayout} +`Value` is a [variant type](http://en.wikipedia.org/wiki/Variant_type). In RapidJSON's context, an instance of `Value` can contain 1 of 6 JSON value types. This is possble by using `union`. Each `Value` contains two members: `union Data data_` and a`unsigned flags_`. The `flags_` indiciates the JSON type, and also additional information. + +The following tables show the data layout of each type. The 32-bit/64-bit columns indicates the size of the field in bytes. + +| Null | |32-bit|64-bit| +|-------------------|----------------------------------|:----:|:----:| +| (unused) | |4 |8 | +| (unused) | |4 |4 | +| (unused) | |4 |4 | +| `unsigned flags_` | `kNullType | kNullFlag` |4 |4 | + +| Bool | |32-bit|64-bit| +|-------------------|----------------------------------------------------|:----:|:----:| +| (unused) | |4 |8 | +| (unused) | |4 |4 | +| (unused) | |4 |4 | +| `unsigned flags_` | `kBoolType | `(either `kTrueFlag` or `kFalseFlag`) |4 |4 | + +| String | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `Ch* str` | Pointer to the string (may own) |4 |8 | +| `SizeType length` | Length of string |4 |4 | +| (unused) | |4 |4 | +| `unsigned flags_` | `kStringType | kStringFlag | ...` |4 |4 | + +| Object | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `Member* members` | Pointer to array of members (owned) |4 |8 | +| `SizeType size` | Number of members |4 |4 | +| `SizeType capacity` | Capacity of members |4 |4 | +| `unsigned flags_` | `kObjectType | kObjectFlag` |4 |4 | + +| Array | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `Value* values` | Pointer to array of values (owned) |4 |8 | +| `SizeType size` | Number of values |4 |4 | +| `SizeType capacity` | Capacity of values |4 |4 | +| `unsigned flags_` | `kArrayType | kArrayFlag` |4 |4 | + +| Number (Int) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `int i` | 32-bit signed integer |4 |4 | +| (zero padding) | 0 |4 |4 | +| (unused) | |4 |8 | +| `unsigned flags_` | `kNumberType | kNumberFlag | kIntFlag | kInt64Flag | ...` |4 |4 | + +| Number (UInt) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `unsigned u` | 32-bit unsigned integer |4 |4 | +| (zero padding) | 0 |4 |4 | +| (unused) | |4 |8 | +| `unsigned flags_` | `kNumberType | kNumberFlag | kUIntFlag | kUInt64Flag | ...` |4 |4 | + +| Number (Int64) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `int64_t i64` | 64-bit signed integer |8 |8 | +| (unused) | |4 |8 | +| `unsigned flags_` | `kNumberType | kNumberFlag | kInt64Flag | ...` |4 |4 | + +| Number (Uint64) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `uint64_t i64` | 64-bit unsigned integer |8 |8 | +| (unused) | |4 |8 | +| `unsigned flags_` | `kNumberType | kNumberFlag | kInt64Flag | ...` |4 |4 | + +| Number (Double) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `uint64_t i64` | Double precision floating-point |8 |8 | +| (unused) | |4 |8 | +| `unsigned flags_` | `kNumberType | kNumberFlag | kDoubleFlag` |4 |4 | + +Here are some notes: +* To reduce memory consumption for 64-bit architecture, `SizeType` is typedef as `unsigned` instead of `size_t`. +* Zero padding for 32-bit number may be placed after or before the actual type, according to the endianess. This makes possible for interpreting a 32-bit integer as a 64-bit integer, without any conversion. +* An `Int` is always an `Int64`, but the converse is not always true. + ## Flags {#Flags} +The 32-bit `flags_` contains both JSON type and other additional information. As shown in the above tables, each JSON type contains redundant `kXXXType` and `kXXXFlag`. This design is for optimizing the operation of testing bit-flags (`IsNumber()`) and obtaining a sequental number for each type (`GetType()`). + +String has two optional flags. `kCopyFlag` means that the string owns a copy of the string. `kInlineStrFlag` means using [Short-String Optimizatoin](#ShortString). + +Number is a bit more complicated. For normal integer values, it can contains `kIntFlag`, `kUintFlag`, `kInt64Flag` and/or `kUint64Flag`, according to the range of the integer. For numbers with fraction, and integers larger than 64-bit range, they will be stored as `double` with `kDoubleFlag`. + +## Short-String Optimization {#ShortString} + + Kosta (@Kosta-Github) provided a very neat short-string optimization. The optimization idea is given as follow. Excluding the `flags_`, a `Value` has 12 or 16 bytes (32-bit or 64-bit) for storing actual data. Instead of storing a pointer to a string, it is possible to store short strings in these space internally. For encoding with 1-byte character type (e.g. `char`), it can store maxium 11 or 15 characters string inside the `Value` type. + +| ShortString (Ch=char) | |32-bit|64-bit| +|---------------------|-------------------------------------|:----:|:----:| +| `Ch str[MaxChars]` | String buffer |11 |15 | +| `Ch invLength` | MaxChars - Length |1 |1 | +| `unsigned flags_` | `kStringType | kStringFlag | ...` |4 |4 | + +A special technique is applied. Instead of storing the length of string directly, it stores (MaxChars - length). This make it possible to store 11 characters with trailing `\0`. + +This optimization can reduce memory usage for copy-string. It can also improve cache-coherence thus improve runtime performance. + # Allocator {#Allocator} +`Allocator` is a concept in RapidJSON: +~~~cpp +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +~~~ + +Note that `Malloc()` and `Realloc()` are member functions but `Free()` is static member function. + ## MemoryPoolAllocator {#MemoryPoolAllocator} +`MemoryPoolAllocator` is the default allocator for DOM. It allocate but do not free memory. This is suitable for building a DOM tree. + +Internally, it allocates chunks of memory from the base allocator (by default `CrtAllocator`) and stores the chunks as a singly linked list. When user requests an allocation, it allocates memory from the following order: + +1. User supplied buffer if it is available. (See [User Buffer section in DOM](dom.md)) +2. If user supplied buffer is full, use the current memory chunk. +3. If the current block is full, allocate a new block of memory. + # Parsing Optimization {#ParsingOptimization} -## Skip Whitespace with SIMD {#SkipwhitespaceWithSIMD} +## Skip Whitespaces with SIMD {#SkipwhitespaceWithSIMD} -## Pow10() {#Pow10} +When parsing JSON from a stream, the parser need to skip 4 whitespace characters: + +1. Space (`U+0020`) +2. Character Tabulation (`U+000B`) +3. Line Feed (`U+000A`) +4. Carriage Return (`U+000D`) + +A simple implementation will be simply: +~~~cpp +void SkipWhitespace(InputStream& s) { + while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') + s.Take(); +} +~~~ + +However, this requires 4 comparisons and a few branching for each character. This was found to be a hot spot. + +To accelerate this process, SIMD was applied to compare 16 characters with 4 white spaces for each iteration. Currently RapidJSON only supports SSE2 and SSE4.1 instructions for this. And it is only activated for UTF-8 memory streams, including string stream or *in situ* parsing. ## Local Stream Copy {#LocalStreamCopy} +During optimization, it is found that some compilers cannot localize some member data access of streams into local variables or registers. Experimental results show that for some stream types, making a copy of the stream and used it in inner-loop can improve performance. For example, the actual (non-SIMD) implementation of `SkipWhitespace()` is implemented as: + +~~~cpp +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t') + s.Take(); +} +~~~ + +Depending on the traits of stream, `StreamLocalCopy` will make (or not make) a copy of the stream object, use it locally and copy the states of stream back to the original stream. + +## Parsing to Double {#ParsingDouble} + +Parsing string into `double` is difficult. The standard library function `strtod()` can do the job but it is slow. By default, the parsers use normal precision setting. This has has maximum 3 [ULP](http://en.wikipedia.org/wiki/Unit_in_the_last_place) error and implemented in `internal::StrtodNormalPrecision()`. + +When using `kParseFullPrecisionFlag`, the parsers calls `internal::StrtodFullPrecision()` instead, and this function actually implemented 3 versions of conversion methods. +1. [Fast-Path](http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/). +2. Custom DIY-FP implementation as in [double-conversion](https://github.com/floitsch/double-conversion). +3. Big Integer Method as in (Clinger, William D. How to read floating point numbers accurately. Vol. 25. No. 6. ACM, 1990). + +If the first conversion methods fail, it will try the second, and so on. + +# Generation Optimizatoin {#GenerationOptimization} + +## Integer-to-String conversion {#itoa} + +The naive algorithm for integer-to-string conversion involves division per each decimal digit. We have implemented various implementations and evaluated them in [itoa-benchmark](https://github.com/miloyip/itoa-benchmark). + +Although SSE2 version is the fastest but the difference is minor by comparing to the first running-up `branchlut`. And `branchlut` is pure C++ implementation so we adopt `branchlut` in RapidJSON. + +## Double-to-String conversion {#dtoa} + +Originally RapidJSON uses `snprintf(..., ..., "%g")` to achieve double-to-string conversion. This is not accurate as the default precision is 6. Later we also find that this is slow and there is an alternative. + +Google's V8 [double-conversion](https://github.com/floitsch/double-conversion +) implemented a newer, fast algorithm called Grisu3 (Loitsch, Florian. "Printing floating-point numbers quickly and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.). + +However, since it is not header-only so that we implemented a header-only version of Grisu2. This algorithm guarantees that the result is always accurate. And in most of cases it produces the shortest (optimal) string representation. + +The header-only conversion function has been evaluated in [dtoa-benchmark](https://github.com/miloyip/dtoa-benchmark). + # Parser {#Parser} ## Iterative Parser {#IterativeParser}