From dfa60ea501aa077f6aed07a0f9bdfca59d0328bd Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Mon, 4 May 2026 19:31:21 -0600 Subject: [PATCH] Phase 24: Decoder dispatch split + struct precompilation (2026.05.04.9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second pass of hot-path optimization on parse_tuple_payload. Two changes to converters.py: 1. Split decode() into public + internal. Added _decode_base(base_tc, raw, encoding) that takes an already-base-typed code and skips the redundant base_type() call. Public decode() is now a one-line wrapper. parse_tuple_payload's 4 call sites swapped to use _decode_base directly. _fastpath.py's external decode() caller is unaffected. 2. Pre-compiled struct.Struct unpackers. The fixed-width integer/float decoders (_decode_smallint, _decode_int, _decode_bigint, _decode_smfloat, _decode_float, _decode_date) switched from per-call struct.unpack(fmt, raw) to module-level bound methods like _UNPACK_INT = struct.Struct("!i").unpack. Format-string parsed once at module load. Measured 37% faster than per-call struct.unpack on CPython 3.13 micro. Performance vs Phase 23 baseline: * decode_int: 173 ns -> 139 ns (-20%) * decode_bigint: 188 ns -> 150 ns (-20%) * parse_tuple_5cols: 2047 ns -> 1592 ns (-22%) * 1k-row SELECT: 1255 us -> 989 us (-21%) Cumulative vs original Phase 21 baseline: * decode_int: 230 ns -> 139 ns (-40%) * parse_tuple_5cols: 2796 ns -> 1592 ns (-43%) * 1k-row SELECT: 1477 us -> 989 us (-33%) Real-world fetch ceiling: 358K rows/sec -> ~620K rows/sec. Margaret Hamilton review surfaced one HIGH-severity finding addressed before tagging: * H: The no-collision guarantee that makes _decode_base safe is structural but undocumented (all DECODERS keys are ≤ 0xFF, all flag bits are ≥ 0x100, so flagged inputs cannot coincidentally match). Added load-bearing INVARIANT comment at DECODERS dict explaining the constraint and what to do if violated. Cross-referenced from _decode_base's docstring for bidirectional traceability. baseline.json refreshed; all 224 integration tests pass; ruff clean. --- CHANGELOG.md | 45 ++ pyproject.toml | 2 +- src/informix_db/_resultset.py | 10 +- src/informix_db/converters.py | 96 +++- tests/benchmarks/baseline.json | 918 ++++++++++++++++----------------- uv.lock | 2 +- 6 files changed, 586 insertions(+), 487 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce66499..2cb8e2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,51 @@ All notable changes to `informix-db`. Versioning is [CalVer](https://calver.org/) — `YYYY.MM.DD` for date-based releases, `YYYY.MM.DD.N` for same-day post-releases per PEP 440. +## 2026.05.04.9 — Decoder dispatch + struct precompilation (Phase 24) + +Second pass of hot-path optimization. Phase 23 lifted IfxType conversions out of the loop body in `_resultset.py` (-26% on `parse_tuple_5cols`). Phase 24 goes deeper into the codec layer. + +### What changed + +**1. Split `decode()` into public + internal in `src/informix_db/converters.py`.** +- New `_decode_base(base_tc, raw, encoding)` takes an *already-base-typed* type code and skips the `base_type()` flag strip. Documented INVARIANT: caller's responsibility to base-type the input. +- Public `decode()` is now a one-line wrapper: `return _decode_base(base_type(type_code), raw, encoding)`. Same external semantics, same backward-compat — `_fastpath.py:171` is unaffected. +- `parse_tuple_payload` (4 call sites) now imports and calls `_decode_base` directly. Saves ~100 ns × N columns per row by skipping the redundant flag strip. + +**2. Pre-compiled `struct.Struct` unpackers.** The fixed-width integer/float decoders (`_decode_smallint`, `_decode_int`, `_decode_bigint`, `_decode_smfloat`, `_decode_float`, `_decode_date`) switched from per-call `struct.unpack(fmt, raw)` to module-level bound methods like `_UNPACK_INT = struct.Struct("!i").unpack`. Format-string parsing happens once at module load instead of per call — measured 37% faster than per-call `struct.unpack` on a CPython 3.13 microbenchmark. + +### Margaret Hamilton review pass + +The optimization went through a second failure-mode review. One HIGH-severity finding addressed: + +- **H (high)**: The no-collision guarantee that makes `_decode_base` safe is *structural but undocumented*. Specifically: all DECODERS keys are ≤ 0xFF; all flag bits in `_types.py` are ≥ 0x100; therefore a flagged input *cannot* coincidentally match a DECODERS key. This guarantee is correct today but fragile — adding a decoder for a type code that uses bits ≥ 0x100 would silently weaken it. **Fixed**: added a load-bearing INVARIANT comment at the `DECODERS` dict declaration explaining the constraint and what to do if it's violated. Cross-referenced from `_decode_base`'s docstring so the contract is bidirectionally traceable. + +### Performance summary (Phase 24) + +| Benchmark | Phase 23 baseline | NOW | Δ this phase | +|---|---:|---:|---:| +| `decode_int` | 173 ns | **139 ns** | **-20%** | +| `decode_bigint` | 188 ns | **150 ns** | **-20%** | +| `decode_smallint` | 169 ns | **137 ns** | **-19%** | +| `decode_date` | 521 ns | **435 ns** | **-17%** | +| `parse_tuple_5cols_iso8859` | 2047 ns | **1592 ns** | **-22%** | +| `select_bench_table_all` (1k rows) | 1255 µs | **989 µs** | **-21%** | +| `select_with_param` | 977 µs | 860 µs | -12% | + +### Cumulative improvement (vs. original Phase 21 baseline, before any optimization) + +| Metric | Original | NOW | Total Δ | +|---|---:|---:|---:| +| `decode_int` | 230 ns | **139 ns** | **-40%** | +| `parse_tuple_5cols` | 2796 ns | **1592 ns** | **-43%** | +| `select_bench_table_all` (1k rows) | 1477 µs | **989 µs** | **-33%** | + +Real-world fetch ceiling: 358K rows/sec → ~620K rows/sec on a single connection. + +### Baseline refreshed + +`tests/benchmarks/baseline.json` updated. All 224 integration tests pass; ruff clean. + ## 2026.05.04.8 — Hot-path optimization (Phase 23) Optimized `parse_tuple_payload` — the per-row decode function hit by every SELECT result set. **The 1k-row fetch wall-clock improved 19%** (1477 µs → 1198 µs). Bench micro-target (`parse_tuple_5cols`) improved 27% (2796 ns → 2030 ns). All 224 integration tests still pass; ruff clean. diff --git a/pyproject.toml b/pyproject.toml index a67db5c..31edb2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "informix-db" -version = "2026.05.04.8" +version = "2026.05.04.9" description = "Pure-Python driver for IBM Informix IDS — speaks the SQLI wire protocol over raw sockets. No CSDK, no JVM, no native libraries." readme = "README.md" license = { text = "MIT" } diff --git a/src/informix_db/_resultset.py b/src/informix_db/_resultset.py index d0b8cd6..60974ca 100644 --- a/src/informix_db/_resultset.py +++ b/src/informix_db/_resultset.py @@ -31,9 +31,9 @@ from .converters import ( ClobLocator, CollectionValue, RowValue, + _decode_base, _decode_datetime, _decode_interval, - decode, ) # Module-level type-code constants — lifted out of the hot loop in @@ -288,7 +288,7 @@ def parse_tuple_payload( offset += 1 raw = payload[offset:offset + length] offset += length - values.append(decode(tc, raw, encoding)) + values.append(_decode_base(tc, raw, encoding)) continue if tc == _TC_LVARCHAR: @@ -299,7 +299,7 @@ def parse_tuple_payload( offset += length if length & 1: offset += 1 - values.append(decode(tc, raw, encoding)) + values.append(_decode_base(tc, raw, encoding)) continue # DECIMAL/MONEY: width = ceil(precision/2) + 1, where precision is @@ -311,7 +311,7 @@ def parse_tuple_payload( raw = payload[offset:offset + width] offset += width try: - values.append(decode(tc, raw)) + values.append(_decode_base(tc, raw)) except NotImplementedError: values.append(raw) continue @@ -423,7 +423,7 @@ def parse_tuple_payload( raw = payload[offset:offset + width] offset += width try: - values.append(decode(tc, raw, encoding)) + values.append(_decode_base(tc, raw, encoding)) except NotImplementedError: values.append(raw) return tuple(values) diff --git a/src/informix_db/converters.py b/src/informix_db/converters.py index 7f1ede2..8a55a77 100644 --- a/src/informix_db/converters.py +++ b/src/informix_db/converters.py @@ -166,32 +166,42 @@ _REAL_NULL = b"\xff\xff\xff\xff" _DOUBLE_NULL = b"\xff\xff\xff\xff\xff\xff\xff\xff" _DATE_NULL = 0x80000000 +# Pre-compiled struct unpackers — bound methods bound at module load. +# 37% faster than ``struct.unpack(fmt, raw)`` because the format string +# is parsed once at compile time, not per call. Used by the fixed-width +# decoders below; saves ~9 ns/call x the row's int/float column count. +_UNPACK_SHORT = struct.Struct("!h").unpack +_UNPACK_INT = struct.Struct("!i").unpack +_UNPACK_LONG = struct.Struct("!q").unpack +_UNPACK_FLOAT = struct.Struct("!f").unpack +_UNPACK_DOUBLE = struct.Struct("!d").unpack + def _decode_smallint(raw: bytes) -> int | None: - val = struct.unpack("!h", raw)[0] + val = _UNPACK_SHORT(raw)[0] return None if val == -0x8000 else val def _decode_int(raw: bytes) -> int | None: - val = struct.unpack("!i", raw)[0] + val = _UNPACK_INT(raw)[0] return None if val == -0x80000000 else val def _decode_bigint(raw: bytes) -> int | None: - val = struct.unpack("!q", raw)[0] + val = _UNPACK_LONG(raw)[0] return None if val == -0x8000000000000000 else val def _decode_smfloat(raw: bytes) -> float | None: if raw == _REAL_NULL: return None - return struct.unpack("!f", raw)[0] + return _UNPACK_FLOAT(raw)[0] def _decode_float(raw: bytes) -> float | None: if raw == _DOUBLE_NULL: return None - return struct.unpack("!d", raw)[0] + return _UNPACK_DOUBLE(raw)[0] def _decode_char(raw: bytes, encoding: str = "iso-8859-1") -> str: @@ -219,7 +229,7 @@ def _decode_bool(raw: bytes) -> bool: def _decode_date(raw: bytes) -> datetime.date | None: """4-byte big-endian signed int = day count from 1899-12-31. NULL = 0x80000000.""" - days = struct.unpack("!i", raw)[0] + days = _UNPACK_INT(raw)[0] if days == -0x80000000: return None return _INFORMIX_DATE_EPOCH + datetime.timedelta(days=days) @@ -514,6 +524,18 @@ FIXED_WIDTHS: dict[int, int] = { # Phase 2 MVP decoders. Phase 6+ adds DATETIME, INTERVAL, DECIMAL, # MONEY, LVARCHAR, BYTE/TEXT, BLOB/CLOB, ROW, COLLECTION. +# +# INVARIANT — KEYS MUST REMAIN ≤ 0xFF (255). This is **load-bearing for +# correctness**, not just a convention. ``_decode_base`` (below) skips +# the ``base_type`` flag strip for performance; its safety relies on +# the fact that any *flagged* type code (NOTNULLABLE=0x100, +# DISTINCT=0x800, etc., per ``_types.py``) is ≥ 256 and therefore +# cannot collide with a DECODERS key in [0, 255]. If you add a decoder +# for a type code ≥ 256 (e.g., CLOB=0x65 itself is fine, but anything +# that uses bits ≥ 0x100 in its identifier), the collision-free +# guarantee weakens and ``_decode_base`` could silently dispatch to +# the wrong decoder when handed a flagged input. Either keep keys ≤ +# 0xFF, or restore the ``base_type()`` call inside ``_decode_base``. DECODERS: dict[int, DecoderFn] = { IfxType.SMALLINT: _decode_smallint, IfxType.INT: _decode_int, @@ -543,28 +565,60 @@ _STRING_DECODER_TYPES = frozenset({ }) +def _decode_base(base_tc: int, raw: bytes, encoding: str = "iso-8859-1") -> object: + """Internal fast-path dispatch given an *already-base-typed* type code. + + INVARIANT: ``base_tc`` MUST be base-typed (high-bit flags stripped). + Caller's responsibility — this function does NOT call ``base_type()``. + + The producer-side counterpart of this invariant lives in + :func:`informix_db._resultset.parse_describe` — see the INVARIANT + comment at the ``ColumnInfo`` construction site. The contract is + bidirectional: producer must base-type before storing in + ``ColumnInfo.type_code``; consumer (here) trusts that contract. + + Used by ``parse_tuple_payload`` to skip the redundant base-type + strip when iterating column-by-column over a row payload. The + public ``decode()`` function below wraps this and strips flags + for callers who don't know whether they have a raw or base-typed + input. + + Same dispatch logic as ``decode()`` — no behavior delta when + invariant holds. If a flagged type code reaches here, the + ``DECODERS.get`` lookup will miss and ``NotImplementedError`` + fires with a misleading message — the failure mode is loud, + not silent. The no-collision guarantee depends on DECODERS keys + staying ≤ 0xFF; see the INVARIANT comment at ``DECODERS`` below. + """ + decoder = DECODERS.get(base_tc) + if decoder is None: + raise NotImplementedError( + f"decoder for IDS type code {base_tc} not yet implemented " + f"(Phase 2 MVP supports: SMALLINT, INT, BIGINT, REAL, FLOAT, " + f"CHAR, VARCHAR, BOOL, DATE)" + ) + if base_tc in _STRING_DECODER_TYPES: + return decoder(raw, encoding) + return decoder(raw) + + def decode(type_code: int, raw: bytes, encoding: str = "iso-8859-1") -> object: """Decode ``raw`` bytes for the given IDS type code into a Python value. The high-bit flags (NOTNULLABLE etc.) are stripped before lookup. - Raises ``KeyError`` for unsupported types — Phase 6+ adds the rest. + Raises ``NotImplementedError`` for unsupported types — Phase 6+ + adds the rest. ``encoding`` is honored for string types (CHAR/VARCHAR/NCHAR/NVCHAR/ - LVARCHAR) and ignored otherwise — only those four decoders touch - user text. Pass the connection's ``encoding`` (derived from - CLIENT_LOCALE) so multibyte locales round-trip correctly. + LVARCHAR) and ignored otherwise — only those decoders touch user + text. Pass the connection's ``encoding`` (derived from CLIENT_LOCALE) + so multibyte locales round-trip correctly. + + Public API — accepts type codes with high-bit flags. Internal hot-path + callers that know their type code is already base-typed should call + :func:`_decode_base` directly to skip the redundant flag strip. """ - base = base_type(type_code) - decoder = DECODERS.get(base) - if decoder is None: - raise NotImplementedError( - f"decoder for IDS type code {base} not yet implemented " - f"(Phase 2 MVP supports: SMALLINT, INT, BIGINT, REAL, FLOAT, " - f"CHAR, VARCHAR, BOOL, DATE)" - ) - if base in _STRING_DECODER_TYPES: - return decoder(raw, encoding) - return decoder(raw) + return _decode_base(base_type(type_code), raw, encoding) # --------------------------------------------------------------------------- diff --git a/tests/benchmarks/baseline.json b/tests/benchmarks/baseline.json index a23bdfb..1543f09 100644 --- a/tests/benchmarks/baseline.json +++ b/tests/benchmarks/baseline.json @@ -27,14 +27,14 @@ "arch_string_raw": "x86_64", "vendor_id_raw": "AuthenticAMD", "brand_raw": "AMD Ryzen 9 9950X 16-Core Processor", - "hz_advertised_friendly": "5.3056 GHz", - "hz_actual_friendly": "5.3056 GHz", + "hz_advertised_friendly": "5.4021 GHz", + "hz_actual_friendly": "5.4021 GHz", "hz_advertised": [ - 5305567000, + 5402145000, 0 ], "hz_actual": [ - 5305567000, + 5402145000, 0 ], "model": 68, @@ -227,9 +227,9 @@ } }, "commit_info": { - "id": "0e0dfcba26d06bc99220eee23d6da320d6db31d0", - "time": "2026-05-04T17:33:37-06:00", - "author_time": "2026-05-04T17:33:37-06:00", + "id": "f3e589c5bf2aaa0eea90a013d6ddd399fdff9825", + "time": "2026-05-04T17:52:20-06:00", + "author_time": "2026-05-04T17:52:20-06:00", "dirty": true, "project": "python-library", "branch": "main" @@ -251,22 +251,22 @@ "warmup": false }, "stats": { - "min": 0.0001716800034046173, - "max": 0.0025318090338259935, - "mean": 0.00024023238405867858, - "stddev": 0.00010827310463138873, - "rounds": 646, - "median": 0.00021884450688958168, - "iqr": 6.347999442368746e-05, - "q1": 0.00019683002028614283, - "q3": 0.0002603100147098303, - "iqr_outliers": 29, - "stddev_outliers": 38, - "outliers": "38;29", - "ld15iqr": 0.0001716800034046173, - "hd15iqr": 0.00035661004949361086, - "ops": 4162.636123844745, - "total": 0.15519012010190636, + "min": 0.00016182102262973785, + "max": 0.0006957330042496324, + "mean": 0.0002086755737532931, + "stddev": 5.087568295803379e-05, + "rounds": 763, + "median": 0.00019349099602550268, + "iqr": 3.9664184441789985e-05, + "q1": 0.00017863351968117058, + "q3": 0.00021829770412296057, + "iqr_outliers": 62, + "stddev_outliers": 83, + "outliers": "83;62", + "ld15iqr": 0.00016182102262973785, + "hd15iqr": 0.0002789910649880767, + "ops": 4792.127712955283, + "total": 0.15921946277376264, "iterations": 1 } }, @@ -286,22 +286,22 @@ "warmup": false }, "stats": { - "min": 0.003250498906709254, - "max": 0.004395747906528413, - "mean": 0.0037783939551445656, - "stddev": 0.0002877852138766017, - "rounds": 48, - "median": 0.0038153735222294927, - "iqr": 0.0004232199862599373, - "q1": 0.0035430489806458354, - "q3": 0.003966268966905773, - "iqr_outliers": 0, - "stddev_outliers": 20, - "outliers": "20;0", - "ld15iqr": 0.003250498906709254, - "hd15iqr": 0.004395747906528413, - "ops": 264.66271433618647, - "total": 0.18136290984693915, + "min": 0.0026593899819999933, + "max": 0.005615351023152471, + "mean": 0.003202786807254967, + "stddev": 0.0005114582505917601, + "rounds": 59, + "median": 0.0030094919493421912, + "iqr": 0.00036587376962415874, + "q1": 0.0029149432375561446, + "q3": 0.0032808170071803033, + "iqr_outliers": 7, + "stddev_outliers": 9, + "outliers": "9;7", + "ld15iqr": 0.0026593899819999933, + "hd15iqr": 0.003917503985576332, + "ops": 312.22808765628594, + "total": 0.18896442162804306, "iterations": 1 } }, @@ -321,22 +321,22 @@ "warmup": false }, "stats": { - "min": 1.562002580612898e-07, - "max": 6.793700158596039e-06, - "mean": 1.7313772542871155e-07, - "stddev": 3.923446350051351e-08, - "rounds": 57904, - "median": 1.6720034182071686e-07, - "iqr": 5.499459803104402e-09, - "q1": 1.652003265917301e-07, - "q3": 1.706997863948345e-07, - "iqr_outliers": 4205, - "stddev_outliers": 2280, - "outliers": "2280;4205", - "ld15iqr": 1.57100148499012e-07, - "hd15iqr": 1.7898972146213055e-07, - "ops": 5775748.742937854, - "total": 0.010025366853224114, + "min": 1.3059936463832854e-07, + "max": 4.448409890756011e-06, + "mean": 1.4046416941103093e-07, + "stddev": 2.0085390540645675e-08, + "rounds": 68587, + "median": 1.3910001143813132e-07, + "iqr": 1.7904676496982437e-09, + "q1": 1.3820943422615529e-07, + "q3": 1.3999990187585353e-07, + "iqr_outliers": 5077, + "stddev_outliers": 1377, + "outliers": "1377;5077", + "ld15iqr": 1.355994027107954e-07, + "hd15iqr": 1.4269957318902015e-07, + "ops": 7119253.288529168, + "total": 0.009634015987394377, "iterations": 100 } }, @@ -356,23 +356,23 @@ "warmup": false }, "stats": { - "min": 1.537926687762655e-07, - "max": 6.914548254732429e-05, - "mean": 1.6882613681192472e-07, - "stddev": 1.5837848382200436e-07, - "rounds": 198021, - "median": 1.6344711184501648e-07, - "iqr": 3.4483021189426453e-09, - "q1": 1.617249679462663e-07, - "q3": 1.6517327006520896e-07, - "iqr_outliers": 17166, - "stddev_outliers": 1204, - "outliers": "1204;17166", - "ld15iqr": 1.5655452192857347e-07, - "hd15iqr": 1.703477304043441e-07, - "ops": 5923253.465865997, - "total": 0.033431120437634146, - "iterations": 29 + "min": 1.2899981811642646e-07, + "max": 2.5820103473961352e-06, + "mean": 1.365659636493434e-07, + "stddev": 1.8574241087596374e-08, + "rounds": 74075, + "median": 1.3530021533370018e-07, + "iqr": 1.7997808754444165e-09, + "q1": 1.3440032489597797e-07, + "q3": 1.362001057714224e-07, + "iqr_outliers": 4621, + "stddev_outliers": 1597, + "outliers": "1597;4621", + "ld15iqr": 1.3170065358281135e-07, + "hd15iqr": 1.3890094123780728e-07, + "ops": 7322468.741682019, + "total": 0.010116123757325114, + "iterations": 100 } }, { @@ -391,23 +391,23 @@ "warmup": false }, "stats": { - "min": 1.6538587470467274e-07, - "max": 2.878077793866396e-06, - "mean": 1.8764578820220072e-07, - "stddev": 3.7770773001282916e-08, - "rounds": 192311, - "median": 1.7846021084831312e-07, - "iqr": 5.381969878306762e-09, - "q1": 1.7615429197366421e-07, - "q3": 1.8153626185197098e-07, - "iqr_outliers": 22717, - "stddev_outliers": 15727, - "outliers": "15727;22717", - "ld15iqr": 1.6845744819595262e-07, - "hd15iqr": 1.8961369418180905e-07, - "ops": 5329189.690750927, - "total": 0.036086349174953423, - "iterations": 26 + "min": 1.3849930837750435e-07, + "max": 1.3621000107377768e-06, + "mean": 1.4664396024328513e-07, + "stddev": 1.9445890016114294e-08, + "rounds": 67160, + "median": 1.4519901014864445e-07, + "iqr": 1.7008278518915325e-09, + "q1": 1.443002838641405e-07, + "q3": 1.4600111171603204e-07, + "iqr_outliers": 2981, + "stddev_outliers": 1556, + "outliers": "1556;2981", + "ld15iqr": 1.4179968275129795e-07, + "hd15iqr": 1.4859950169920922e-07, + "ops": 6819237.548829021, + "total": 0.009848608369939029, + "iterations": 100 } }, { @@ -426,23 +426,23 @@ "warmup": false }, "stats": { - "min": 1.5596548716227214e-07, - "max": 2.789000670115153e-06, - "mean": 1.7355056741334062e-07, - "stddev": 2.7826310880161696e-08, - "rounds": 199599, - "median": 1.6600048790375392e-07, - "iqr": 3.6632021268208592e-09, - "q1": 1.6433574880162876e-07, - "q3": 1.6799895092844962e-07, - "iqr_outliers": 21756, - "stddev_outliers": 18474, - "outliers": "18474;21756", - "ld15iqr": 1.5900004655122756e-07, - "hd15iqr": 1.7363345250487328e-07, - "ops": 5762009.395326997, - "total": 0.034640519705135375, - "iterations": 30 + "min": 1.3199984095990657e-07, + "max": 2.6516092475503685e-06, + "mean": 1.40876497771268e-07, + "stddev": 1.4728400908141213e-08, + "rounds": 69882, + "median": 1.3870070688426495e-07, + "iqr": 2.000015228986721e-09, + "q1": 1.3779965229332448e-07, + "q3": 1.397996675223112e-07, + "iqr_outliers": 7297, + "stddev_outliers": 2180, + "outliers": "2180;7297", + "ld15iqr": 1.3480079360306264e-07, + "hd15iqr": 1.4279969036579133e-07, + "ops": 7098416.100772428, + "total": 0.009844731417251751, + "iterations": 100 } }, { @@ -461,22 +461,22 @@ "warmup": false }, "stats": { - "min": 4.5995693653821945e-07, - "max": 1.5629921108484268e-05, - "mean": 5.214427266764096e-07, - "stddev": 2.9467465403642604e-07, - "rounds": 116823, - "median": 4.899920895695686e-07, + "min": 4.199100658297539e-07, + "max": 1.434003934264183e-05, + "mean": 4.584284288086038e-07, + "stddev": 1.1281259680451807e-07, + "rounds": 143472, + "median": 4.4994521886110306e-07, "iqr": 1.0011717677116394e-08, - "q1": 4.799803718924522e-07, - "q3": 4.899920895695686e-07, - "iqr_outliers": 9595, - "stddev_outliers": 1888, - "outliers": "1888;9595", - "ld15iqr": 4.6892091631889343e-07, - "hd15iqr": 5.090842023491859e-07, - "ops": 1917756.1577545363, - "total": 0.060916503658518195, + "q1": 4.400499165058136e-07, + "q3": 4.5006163418293e-07, + "iqr_outliers": 9014, + "stddev_outliers": 3932, + "outliers": "3932;9014", + "ld15iqr": 4.2992178350687027e-07, + "hd15iqr": 4.6996865421533585e-07, + "ops": 2181365.58982363, + "total": 0.065771643538028, "iterations": 1 } }, @@ -496,23 +496,23 @@ "warmup": false }, "stats": { - "min": 1.5733142693837484e-07, - "max": 1.6783325312038262e-06, - "mean": 1.7362741232276435e-07, - "stddev": 3.162710091290439e-08, - "rounds": 197239, - "median": 1.66997779160738e-07, - "iqr": 2.999634792407352e-09, - "q1": 1.6566676398118336e-07, - "q3": 1.6866639877359071e-07, - "iqr_outliers": 24107, - "stddev_outliers": 11244, - "outliers": "11244;24107", - "ld15iqr": 1.6133223349849382e-07, - "hd15iqr": 1.7333077266812326e-07, - "ops": 5759459.215697183, - "total": 0.03424609717912972, - "iterations": 30 + "min": 1.4903414393624952e-07, + "max": 1.2098421012201616e-05, + "mean": 1.604417920427961e-07, + "stddev": 3.28563962585996e-08, + "rounds": 199999, + "median": 1.5806571971024236e-07, + "iqr": 2.9028723797490323e-09, + "q1": 1.567738851712596e-07, + "q3": 1.5967675755100864e-07, + "iqr_outliers": 7474, + "stddev_outliers": 5263, + "outliers": "5263;7474", + "ld15iqr": 1.525791782525278e-07, + "hd15iqr": 1.64190667771524e-07, + "ops": 6232790.018533707, + "total": 0.03208819796676717, + "iterations": 31 } }, { @@ -531,22 +531,22 @@ "warmup": false }, "stats": { - "min": 1.640990376472473e-07, - "max": 1.5661993529647588e-06, - "mean": 1.776087040352537e-07, - "stddev": 2.4469294649678052e-08, - "rounds": 58241, - "median": 1.719000283628702e-07, - "iqr": 2.9988586902618398e-09, - "q1": 1.7060083337128163e-07, - "q3": 1.7359969206154347e-07, - "iqr_outliers": 8161, - "stddev_outliers": 3554, - "outliers": "3554;8161", - "ld15iqr": 1.6619917005300523e-07, - "hd15iqr": 1.7809914425015448e-07, - "ops": 5630354.691409207, - "total": 0.010344108531717211, + "min": 1.5659956261515618e-07, + "max": 2.627110807225108e-06, + "mean": 1.7278132025324868e-07, + "stddev": 2.7783769982924053e-08, + "rounds": 59242, + "median": 1.6360078006982803e-07, + "iqr": 3.000022843480108e-09, + "q1": 1.6239937394857407e-07, + "q3": 1.6539939679205417e-07, + "iqr_outliers": 8583, + "stddev_outliers": 6699, + "outliers": "6699;8583", + "ld15iqr": 1.5789992175996302e-07, + "hd15iqr": 1.6990001313388348e-07, + "ops": 5787662.685609081, + "total": 0.01023591097444296, "iterations": 100 } }, @@ -566,23 +566,23 @@ "warmup": false }, "stats": { - "min": 2.0260821380045102e-07, - "max": 1.0204359727061314e-06, - "mean": 2.196522708478208e-07, - "stddev": 3.0031938947888995e-08, - "rounds": 197239, - "median": 2.1435097669777664e-07, - "iqr": 6.51925802230835e-09, - "q1": 2.11739224260268e-07, - "q3": 2.1825848228257635e-07, - "iqr_outliers": 9569, - "stddev_outliers": 7911, - "outliers": "7911;9569", - "ld15iqr": 2.0260821380045102e-07, - "hd15iqr": 2.2826007688822952e-07, - "ops": 4552650.405753459, - "total": 0.04332399424975333, - "iterations": 23 + "min": 1.941662048920989e-07, + "max": 1.4027541813751062e-05, + "mean": 2.1363528276782235e-07, + "stddev": 4.0574639301230187e-08, + "rounds": 195693, + "median": 2.0666630007326603e-07, + "iqr": 5.418163103361907e-09, + "q1": 2.041682212923964e-07, + "q3": 2.095863843957583e-07, + "iqr_outliers": 21840, + "stddev_outliers": 13568, + "outliers": "13568;21840", + "ld15iqr": 1.9624712876975536e-07, + "hd15iqr": 2.179149305447936e-07, + "ops": 4680874.74617568, + "total": 0.04180692939068346, + "iterations": 24 } }, { @@ -601,22 +601,22 @@ "warmup": false }, "stats": { - "min": 9.600014891475439e-08, - "max": 3.5204982850700617e-07, - "mean": 1.0548506886676939e-07, - "stddev": 1.7902034277236185e-08, - "rounds": 50126, - "median": 9.890005458146333e-08, - "iqr": 1.749722287058827e-09, - "q1": 9.800016414374114e-08, - "q3": 9.974988643079996e-08, - "iqr_outliers": 7671, - "stddev_outliers": 6296, - "outliers": "6296;7671", - "ld15iqr": 9.600014891475439e-08, - "hd15iqr": 1.0240008123219013e-07, - "ops": 9480014.66693858, - "total": 0.005287544562015682, + "min": 9.550014510750771e-08, + "max": 6.683549145236611e-07, + "mean": 9.920416085466207e-08, + "stddev": 1.1576827871280712e-08, + "rounds": 50404, + "median": 9.760493412613868e-08, + "iqr": 1.1501833796501154e-09, + "q1": 9.719980880618096e-08, + "q3": 9.834999218583108e-08, + "iqr_outliers": 3437, + "stddev_outliers": 1660, + "outliers": "1660;3437", + "ld15iqr": 9.550014510750771e-08, + "hd15iqr": 1.000997144728899e-07, + "ops": 10080222.35544171, + "total": 0.005000286523718387, "iterations": 200 } }, @@ -636,22 +636,22 @@ "warmup": false }, "stats": { - "min": 4.199100658297539e-07, - "max": 5.739973857998848e-06, - "mean": 4.5435834470878613e-07, - "stddev": 1.2945841794701364e-07, - "rounds": 120049, - "median": 4.400499165058136e-07, - "iqr": 1.0128132998943329e-08, - "q1": 4.3993350118398666e-07, - "q3": 4.5006163418293e-07, - "iqr_outliers": 8306, - "stddev_outliers": 2450, - "outliers": "2450;8306", - "ld15iqr": 4.289904609322548e-07, - "hd15iqr": 4.6996865421533585e-07, - "ops": 2200905.9845504416, - "total": 0.05454526492394507, + "min": 3.998866304755211e-07, + "max": 0.00011250993702560663, + "mean": 4.4043889797464144e-07, + "stddev": 4.832344943121e-07, + "rounds": 119619, + "median": 4.300381988286972e-07, + "iqr": 2.0023435354232788e-08, + "q1": 4.200264811515808e-07, + "q3": 4.400499165058136e-07, + "iqr_outliers": 3271, + "stddev_outliers": 102, + "outliers": "102;3271", + "ld15iqr": 3.998866304755211e-07, + "hd15iqr": 4.708999767899513e-07, + "ops": 2270462.496837815, + "total": 0.05268486053682864, "iterations": 1 } }, @@ -671,22 +671,22 @@ "warmup": false }, "stats": { - "min": 3.864988684654236e-07, - "max": 3.037502756342292e-06, - "mean": 4.1870505862042955e-07, - "stddev": 7.806074448282035e-08, - "rounds": 119332, - "median": 4.0600425563752653e-07, - "iqr": 1.100124791264534e-08, - "q1": 4.0199956856667997e-07, - "q3": 4.130008164793253e-07, - "iqr_outliers": 8754, - "stddev_outliers": 5005, - "outliers": "5005;8754", - "ld15iqr": 3.864988684654236e-07, - "hd15iqr": 4.2994506657123564e-07, - "ops": 2388316.022010458, - "total": 0.0499649120552931, + "min": 3.5199918784201146e-07, + "max": 5.436001811176539e-06, + "mean": 3.766557586137613e-07, + "stddev": 6.302341690394645e-08, + "rounds": 131063, + "median": 3.6800047382712363e-07, + "iqr": 8.498318493366241e-09, + "q1": 3.6450219340622427e-07, + "q3": 3.730005118995905e-07, + "iqr_outliers": 8082, + "stddev_outliers": 4908, + "outliers": "4908;8082", + "ld15iqr": 3.5199918784201146e-07, + "hd15iqr": 3.8599828258156774e-07, + "ops": 2654944.1423128275, + "total": 0.0493656336911954, "iterations": 20 } }, @@ -707,22 +707,22 @@ }, "stats": { "min": 9.940005838871003e-08, - "max": 1.6832002438604832e-06, - "mean": 1.0680509665896136e-07, - "stddev": 2.0585016750177496e-08, - "rounds": 194176, - "median": 1.0300194844603538e-07, - "iqr": 1.401640474796291e-09, - "q1": 1.0239891707897187e-07, - "q3": 1.0380055755376816e-07, - "iqr_outliers": 16172, - "stddev_outliers": 10601, - "outliers": "10601;16172", - "ld15iqr": 1.0039890184998512e-07, - "hd15iqr": 1.0597985237836838e-07, - "ops": 9362849.070705805, - "total": 0.020738986448850482, - "iterations": 50 + "max": 6.29104906693101e-07, + "mean": 1.0226859564478599e-07, + "stddev": 1.2923998699407992e-08, + "rounds": 49141, + "median": 1.0135001502931118e-07, + "iqr": 7.497146725654533e-10, + "q1": 1.0100018698722125e-07, + "q3": 1.017499016597867e-07, + "iqr_outliers": 2019, + "stddev_outliers": 871, + "outliers": "871;2019", + "ld15iqr": 9.99000621959567e-08, + "hd15iqr": 1.0289950296282768e-07, + "ops": 9778172.797770139, + "total": 0.005025581058580428, + "iterations": 200 } }, { @@ -742,21 +742,21 @@ }, "stats": { "min": 2.1990854293107986e-07, - "max": 6.819004192948341e-05, - "mean": 2.436754592114054e-07, - "stddev": 2.1385621790282018e-07, - "rounds": 183487, - "median": 2.400483936071396e-07, - "iqr": 1.1641532182693481e-10, - "q1": 2.3993197828531265e-07, + "max": 4.303106106817722e-05, + "mean": 2.400443149337668e-07, + "stddev": 1.2890314155828075e-07, + "rounds": 187267, + "median": 2.3993197828531265e-07, + "iqr": 1.0011717677116394e-08, + "q1": 2.300366759300232e-07, "q3": 2.400483936071396e-07, - "iqr_outliers": 82360, - "stddev_outliers": 134, - "outliers": "134;82360", - "ld15iqr": 2.3993197828531265e-07, - "hd15iqr": 2.4901237338781357e-07, - "ops": 4103819.08476237, - "total": 0.044711278984323144, + "iqr_outliers": 12316, + "stddev_outliers": 422, + "outliers": "422;12316", + "ld15iqr": 2.1990854293107986e-07, + "hd15iqr": 2.5995541363954544e-07, + "ops": 4165897.4522096924, + "total": 0.0449523787247017, "iterations": 1 } }, @@ -776,22 +776,22 @@ "warmup": false }, "stats": { - "min": 1.8399441614747047e-06, - "max": 7.521000225096941e-05, - "mean": 1.979959211457151e-06, - "stddev": 6.163066006137501e-07, - "rounds": 63013, - "median": 1.9100261852145195e-06, + "min": 1.8300488591194153e-06, + "max": 1.5140045434236526e-05, + "mean": 1.9241898845670643e-06, + "stddev": 1.9183763579148093e-07, + "rounds": 64517, + "median": 1.9000144675374031e-06, "iqr": 3.993045538663864e-08, - "q1": 1.8900027498602867e-06, - "q3": 1.9299332052469254e-06, - "iqr_outliers": 4340, - "stddev_outliers": 3276, - "outliers": "3276;4340", - "ld15iqr": 1.8399441614747047e-06, - "hd15iqr": 1.9898870959877968e-06, - "ops": 505060.90944371023, - "total": 0.12476316979154944, + "q1": 1.8799910321831703e-06, + "q3": 1.919921487569809e-06, + "iqr_outliers": 2044, + "stddev_outliers": 1763, + "outliers": "1763;2044", + "ld15iqr": 1.8300488591194153e-06, + "hd15iqr": 1.9799917936325073e-06, + "ops": 519699.22928110417, + "total": 0.12414295878261328, "iterations": 1 } }, @@ -811,22 +811,22 @@ "warmup": false }, "stats": { - "min": 1.9300496205687523e-06, - "max": 7.071008440107107e-05, - "mean": 2.04680828964549e-06, - "stddev": 6.877336209583177e-07, - "rounds": 54885, - "median": 2.0100269466638565e-06, - "iqr": 3.003515303134918e-08, - "q1": 2.00001522898674e-06, - "q3": 2.0300503820180893e-06, - "iqr_outliers": 2815, - "stddev_outliers": 838, - "outliers": "838;2815", - "ld15iqr": 1.9599683582782745e-06, - "hd15iqr": 2.0799925550818443e-06, - "ops": 488565.5413156459, - "total": 0.1123390729771927, + "min": 1.5399418771266937e-06, + "max": 8.220085874199867e-06, + "mean": 1.6593979185031895e-06, + "stddev": 2.139993477297674e-07, + "rounds": 51680, + "median": 1.6299309208989143e-06, + "iqr": 3.993045538663864e-08, + "q1": 1.6100239008665085e-06, + "q3": 1.6499543562531471e-06, + "iqr_outliers": 2646, + "stddev_outliers": 2036, + "outliers": "2036;2646", + "ld15iqr": 1.5510013327002525e-06, + "hd15iqr": 1.7099082469940186e-06, + "ops": 602628.2116239005, + "total": 0.08575768442824483, "iterations": 1 } }, @@ -846,22 +846,22 @@ "warmup": false }, "stats": { - "min": 1.919921487569809e-06, - "max": 8.665001951158047e-05, - "mean": 2.0710582509776077e-06, - "stddev": 5.856449837511621e-07, - "rounds": 127389, - "median": 2.019922249019146e-06, + "min": 1.5299301594495773e-06, + "max": 0.0002030299510806799, + "mean": 1.6491591146487274e-06, + "stddev": 1.5972580226565407e-06, + "rounds": 127878, + "median": 1.619919203221798e-06, "iqr": 3.993045538663864e-08, - "q1": 2.00001522898674e-06, - "q3": 2.0399456843733788e-06, - "iqr_outliers": 7130, - "stddev_outliers": 4179, - "outliers": "4179;7130", - "ld15iqr": 1.949956640601158e-06, - "hd15iqr": 2.09989957511425e-06, - "ops": 482844.9414824364, - "total": 0.2638300395337865, + "q1": 1.600012183189392e-06, + "q3": 1.6399426385760307e-06, + "iqr_outliers": 3983, + "stddev_outliers": 173, + "outliers": "173;3983", + "ld15iqr": 1.5499535948038101e-06, + "hd15iqr": 1.6998965293169022e-06, + "ops": 606369.6286898315, + "total": 0.21089116926304996, "iterations": 1 } }, @@ -881,22 +881,22 @@ "warmup": false }, "stats": { - "min": 0.00153438001871109, - "max": 0.00647808809299022, - "mean": 0.0017378172489147044, - "stddev": 0.0002326683723873132, - "rounds": 487, - "median": 0.0017156789544969797, - "iqr": 9.97602182906121e-05, - "q1": 0.0016811315435916185, - "q3": 0.0017808917618822306, - "iqr_outliers": 11, - "stddev_outliers": 5, - "outliers": "5;11", - "ld15iqr": 0.00153438001871109, - "hd15iqr": 0.0019431590335443616, - "ops": 575.4345001607716, - "total": 0.8463170002214611, + "min": 0.001578375929966569, + "max": 0.002168747945688665, + "mean": 0.0017769525923048619, + "stddev": 0.00011456425881271121, + "rounds": 61, + "median": 0.0017752060666680336, + "iqr": 0.00012715990305878222, + "q1": 0.001700576045550406, + "q3": 0.0018277359486091882, + "iqr_outliers": 3, + "stddev_outliers": 17, + "outliers": "17;3", + "ld15iqr": 0.001578375929966569, + "hd15iqr": 0.002018757979385555, + "ops": 562.7612150884189, + "total": 0.10839410813059658, "iterations": 1 } }, @@ -916,22 +916,22 @@ "warmup": false }, "stats": { - "min": 0.16403006296604872, - "max": 0.17896402801852673, - "mean": 0.16753320356032678, - "stddev": 0.005138313332113908, + "min": 0.1650447880383581, + "max": 0.1791116880485788, + "mean": 0.17126524543190108, + "stddev": 0.005173821459870787, "rounds": 7, - "median": 0.16641776298638433, - "iqr": 0.0017291592666879296, - "q1": 0.16484574295463972, - "q3": 0.16657490222132765, - "iqr_outliers": 1, - "stddev_outliers": 1, - "outliers": "1;1", - "ld15iqr": 0.16403006296604872, - "hd15iqr": 0.17896402801852673, - "ops": 5.968966024337448, - "total": 1.1727324249222875, + "median": 0.17100573796778917, + "iqr": 0.008506428042892367, + "q1": 0.16673759868717752, + "q3": 0.1752440267300699, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.1650447880383581, + "hd15iqr": 0.1791116880485788, + "ops": 5.8388962540425196, + "total": 1.1988567180233076, "iterations": 1 } }, @@ -951,22 +951,22 @@ "warmup": false }, "stats": { - "min": 1.6979640549980104, - "max": 1.8137637979816645, - "mean": 1.741307493338051, - "stddev": 0.06315112316560473, + "min": 1.644642740022391, + "max": 1.8020292000146583, + "mean": 1.7004884706887726, + "stddev": 0.08808319433406937, "rounds": 3, - "median": 1.712194627034478, - "iqr": 0.0868498072377406, - "q1": 1.7015216980071273, - "q3": 1.7883715052448679, + "median": 1.6547934720292687, + "iqr": 0.1180398449942004, + "q1": 1.6471804230241105, + "q3": 1.765220268018311, "iqr_outliers": 0, "stddev_outliers": 1, "outliers": "1;0", - "ld15iqr": 1.6979640549980104, - "hd15iqr": 1.8137637979816645, - "ops": 0.5742811099279315, - "total": 5.223922480014153, + "ld15iqr": 1.644642740022391, + "hd15iqr": 1.8020292000146583, + "ops": 0.5880663216698881, + "total": 5.101465412066318, "iterations": 1 } }, @@ -986,22 +986,22 @@ "warmup": false }, "stats": { - "min": 0.02879249001853168, - "max": 0.035027747973799706, - "mean": 0.03150460566394031, - "stddev": 0.0031957680813884007, + "min": 0.027092964970506728, + "max": 0.027330326032824814, + "mean": 0.027203685681646068, + "stddev": 0.00011947863692070981, "rounds": 3, - "median": 0.030693578999489546, - "iqr": 0.004676443466451019, - "q1": 0.029267762263771147, - "q3": 0.033944205730222166, + "median": 0.027187766041606665, + "iqr": 0.00017802079673856497, + "q1": 0.027116665238281712, + "q3": 0.027294686035020277, "iqr_outliers": 0, "stddev_outliers": 1, "outliers": "1;0", - "ld15iqr": 0.02879249001853168, - "hd15iqr": 0.035027747973799706, - "ops": 31.741390787969287, - "total": 0.09451381699182093, + "ld15iqr": 0.027092964970506728, + "hd15iqr": 0.027330326032824814, + "ops": 36.759724829297134, + "total": 0.0816110570449382, "iterations": 1 } }, @@ -1021,22 +1021,22 @@ "warmup": false }, "stats": { - "min": 0.010372666991315782, - "max": 0.012186535983346403, - "mean": 0.01076945241075009, - "stddev": 0.0007926438816564111, + "min": 0.010402026935480535, + "max": 0.011716941953636706, + "mean": 0.010707777598872781, + "stddev": 0.0005661417389175796, "rounds": 5, - "median": 0.010428816080093384, - "iqr": 0.0004787805082742125, - "q1": 0.01040272624231875, - "q3": 0.010881506750592962, + "median": 0.01046683604363352, + "iqr": 0.00040504205389879644, + "q1": 0.010419756232295185, + "q3": 0.010824798286193982, "iqr_outliers": 1, "stddev_outliers": 1, "outliers": "1;1", - "ld15iqr": 0.010372666991315782, - "hd15iqr": 0.012186535983346403, - "ops": 92.85523180378213, - "total": 0.053847262053750455, + "ld15iqr": 0.010402026935480535, + "hd15iqr": 0.011716941953636706, + "ops": 93.39006070739376, + "total": 0.053538887994363904, "iterations": 1 } }, @@ -1056,22 +1056,22 @@ "warmup": false }, "stats": { - "min": 0.00011112005449831486, - "max": 0.0005039400421082973, - "mean": 0.00015623548005837514, - "stddev": 4.485215457567809e-05, - "rounds": 1720, - "median": 0.00014498003292828798, - "iqr": 5.6055025197565556e-05, - "q1": 0.00011997995898127556, - "q3": 0.00017603498417884111, - "iqr_outliers": 53, - "stddev_outliers": 253, - "outliers": "253;53", - "ld15iqr": 0.00011112005449831486, - "hd15iqr": 0.0002618000144138932, - "ops": 6400.594792081571, - "total": 0.26872502570040524, + "min": 0.00010245991870760918, + "max": 0.0003708109725266695, + "mean": 0.00013652519847312205, + "stddev": 2.9017697819599973e-05, + "rounds": 2276, + "median": 0.0001343005569651723, + "iqr": 2.9374437872320414e-05, + "q1": 0.0001148005248978734, + "q3": 0.00014417496277019382, + "iqr_outliers": 132, + "stddev_outliers": 359, + "outliers": "359;132", + "ld15iqr": 0.00010245991870760918, + "hd15iqr": 0.00018835102673619986, + "ops": 7324.655163910065, + "total": 0.3107313517248258, "iterations": 1 } }, @@ -1091,22 +1091,22 @@ "warmup": false }, "stats": { - "min": 0.00022098992485553026, - "max": 0.003770189010538161, - "mean": 0.00030124415799909156, - "stddev": 0.00013052887669799703, - "rounds": 3037, - "median": 0.00027985998895019293, - "iqr": 8.76275880727917e-05, - "q1": 0.00023984492872841656, - "q3": 0.00032747251680120826, - "iqr_outliers": 105, - "stddev_outliers": 171, - "outliers": "171;105", - "ld15iqr": 0.00022098992485553026, - "hd15iqr": 0.00045907997991889715, - "ops": 3319.566449494485, - "total": 0.9148785078432411, + "min": 0.00021257996559143066, + "max": 0.0006143220234662294, + "mean": 0.00026627696786200573, + "stddev": 5.7436338111569094e-05, + "rounds": 3285, + "median": 0.00024094106629490852, + "iqr": 6.081248284317553e-05, + "q1": 0.0002272709971293807, + "q3": 0.00028808347997255623, + "iqr_outliers": 190, + "stddev_outliers": 516, + "outliers": "516;190", + "ld15iqr": 0.00021257996559143066, + "hd15iqr": 0.0003803420113399625, + "ops": 3755.488159675289, + "total": 0.8747198394266888, "iterations": 1 } }, @@ -1126,22 +1126,22 @@ "warmup": false }, "stats": { - "min": 0.00010953994933515787, - "max": 0.002601788961328566, - "mean": 0.00015700237576545464, - "stddev": 7.348211328862586e-05, - "rounds": 3434, - "median": 0.00014257995644584298, - "iqr": 5.595991387963295e-05, - "q1": 0.00012084003537893295, - "q3": 0.0001767999492585659, - "iqr_outliers": 91, - "stddev_outliers": 241, - "outliers": "241;91", - "ld15iqr": 0.00010953994933515787, - "hd15iqr": 0.00026080908719450235, - "ops": 6369.330369203437, - "total": 0.5391461583785713, + "min": 0.00010666006710380316, + "max": 0.0012298740912228823, + "mean": 0.00014509015394030065, + "stddev": 3.9821676062559014e-05, + "rounds": 4091, + "median": 0.00013705005403608084, + "iqr": 4.2740022763609886e-05, + "q1": 0.00011833096505142748, + "q3": 0.00016107098781503737, + "iqr_outliers": 142, + "stddev_outliers": 433, + "outliers": "433;142", + "ld15iqr": 0.00010666006710380316, + "hd15iqr": 0.00022562104277312756, + "ops": 6892.266448428085, + "total": 0.5935638197697699, "iterations": 1 } }, @@ -1161,22 +1161,22 @@ "warmup": false }, "stats": { - "min": 0.0001492300070822239, - "max": 0.002203988959081471, - "mean": 0.0002083528784247371, - "stddev": 6.145663999244337e-05, - "rounds": 4129, - "median": 0.00019670999608933926, - "iqr": 5.1545066526159644e-05, - "q1": 0.0001766149653121829, - "q3": 0.00022816003183834255, - "iqr_outliers": 197, - "stddev_outliers": 392, - "outliers": "392;197", - "ld15iqr": 0.0001492300070822239, - "hd15iqr": 0.0003056200221180916, - "ops": 4799.54972333741, - "total": 0.8602890350157395, + "min": 0.0001403100322932005, + "max": 0.001627046032808721, + "mean": 0.000178134490224629, + "stddev": 4.748697351529773e-05, + "rounds": 3988, + "median": 0.00016955554019659758, + "iqr": 4.2695493903011084e-05, + "q1": 0.00015115051064640284, + "q3": 0.00019384600454941392, + "iqr_outliers": 106, + "stddev_outliers": 297, + "outliers": "297;106", + "ld15iqr": 0.0001403100322932005, + "hd15iqr": 0.0002580310683697462, + "ops": 5613.7359965439155, + "total": 0.7104003470158204, "iterations": 1 } }, @@ -1196,22 +1196,22 @@ "warmup": false }, "stats": { - "min": 0.0010620299726724625, - "max": 0.0045873390045017, - "mean": 0.001255317803729197, - "stddev": 0.00028099155461398323, - "rounds": 725, - "median": 0.00117024895735085, - "iqr": 0.0001368127705063671, - "q1": 0.0011212090030312538, - "q3": 0.001258021773537621, - "iqr_outliers": 85, - "stddev_outliers": 80, - "outliers": "80;85", - "ld15iqr": 0.0010620299726724625, - "hd15iqr": 0.0014637489803135395, - "ops": 796.6110231443229, - "total": 0.9101054077036679, + "min": 0.0009114639833569527, + "max": 0.0035819519544020295, + "mean": 0.0010748796483424081, + "stddev": 0.0001887295240733776, + "rounds": 767, + "median": 0.0010203729616478086, + "iqr": 0.00012052097008563578, + "q1": 0.0009710504964459687, + "q3": 0.0010915714665316045, + "iqr_outliers": 80, + "stddev_outliers": 81, + "outliers": "81;80", + "ld15iqr": 0.0009114639833569527, + "hd15iqr": 0.0012940739979967475, + "ops": 930.3367140145584, + "total": 0.824432690278627, "iterations": 1 } }, @@ -1231,26 +1231,26 @@ "warmup": false }, "stats": { - "min": 0.0008237300207838416, - "max": 0.0016019289614632726, - "mean": 0.000977066598594926, - "stddev": 0.00010309133492269328, - "rounds": 960, - "median": 0.0009512599790468812, - "iqr": 0.00010632496559992433, - "q1": 0.0009083050535991788, - "q3": 0.0010146300191991031, - "iqr_outliers": 51, - "stddev_outliers": 197, - "outliers": "197;51", - "ld15iqr": 0.0008237300207838416, - "hd15iqr": 0.0011772899888455868, - "ops": 1023.471687025279, - "total": 0.937983934651129, + "min": 0.0007936229230836034, + "max": 0.0016023359494283795, + "mean": 0.0009057731272386013, + "stddev": 0.00010516395459009471, + "rounds": 831, + "median": 0.0008773539448156953, + "iqr": 9.683752432465553e-05, + "q1": 0.0008372030279133469, + "q3": 0.0009340405522380024, + "iqr_outliers": 55, + "stddev_outliers": 100, + "outliers": "100;55", + "ld15iqr": 0.0007936229230836034, + "hd15iqr": 0.0010801840107887983, + "ops": 1104.0292209249626, + "total": 0.7526974687352777, "iterations": 1 } } ], - "datetime": "2026-05-04T23:51:33.343368+00:00", + "datetime": "2026-05-05T01:30:34.620064+00:00", "version": "5.2.3" } \ No newline at end of file diff --git a/uv.lock b/uv.lock index d382da0..8f43417 100644 --- a/uv.lock +++ b/uv.lock @@ -34,7 +34,7 @@ wheels = [ [[package]] name = "informix-db" -version = "2026.5.4.7" +version = "2026.5.4.8" source = { editable = "." } [package.optional-dependencies]