Tags: terwanerik/postgres-kit
Tags
Significantly improve performance of row decoding. (vapor#130) (vapor… …#134) * Significantly improve performance of row decoding. Motivation: 1. `PostgreSQLRowDecoder`: `_KeyedDecodingContainer.decode` is called once for each key on the decoded object. With the current implementation, this performs a linear search on the `row` dictionary, which results in a total runtime (per object) of O(keys * columns), i.e. quadratic runtime ~O(keys^2). We replace the current linear search with one or two dictionary lookups if `tableOID != 0`, resulting in linear runtime (per object) in the number of keys (provided dictionary lookups can be assumed to take roughly constant time). 2. `PostgreSQLConnection.TableNameCache`: Most lookups are `tableName -> OID`. We accelerate that lookup by preparing a dictionary for that kind of lookup ahead of time, again replacing linear search. Effect: The time required for decoding ~5k objects with 9 fields each drops from ~0.4s on a Core i7-6700k (Release build) to ~0.2s, effectively doubling throughput. Optimization 1 contributes ~130 ms, Optimization 2 contributes ~70ms. * Whitespace fixes. * Comment fix. * More whitespace, sorry. * Implement `decodeIfPresent` to avoid two dictionary lookups per call. * Minor code simplification.
Fix empty keyed encoding (vapor#123) * Add test for empty keyed encoding * Replace _KeyedError with a flag that is set as soon as a keyed container is requested The encoder will fallback to JSONB using JSONEncoder even if the encoded type does not encode any key.
PreviousNext