diff --git a/CHANGELOG.md b/CHANGELOG.md index 484ca06..ce66499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,45 @@ 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.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. + +### What changed (`src/informix_db/_resultset.py`) + +- **Removed redundant `base_type()` call from the hot loop.** `ColumnInfo.type_code` is already base-typed by `parse_describe` at construction — calling `base_type(col.type_code)` again per column per row was pure waste. This was the single largest savings. +- **Lifted `int(IfxType.X)` to module-level constants** (`_TC_CHAR`, `_TC_VARCHAR`, etc.). Original code did the IntFlag→int conversion inline ~10 times per loop iteration; now done once at module import. +- **Moved lazy imports to module top** (`_decode_datetime`, `_decode_interval`, `BlobLocator`, `ClobLocator`, `RowValue`, `CollectionValue`). Saves a per-call attribute lookup; verified no circular import risk. +- **Three precomputed frozensets** (`_LENGTH_PREFIXED_SHORT_TYPES`, `_COMPOSITE_UDT_TYPES`, `_NUMERIC_TYPES`) replace inline tuple-membership checks. +- **`_COLLECTION_KIND_MAP` wrapped in `MappingProxyType`** — actually frozen against accidental mutation, not just nominally. + +### Margaret Hamilton review pass + +The optimization went through a rigorous failure-mode review. Findings addressed before tagging: + +- **H1 (high)**: `cursor._dereference_blob_columns` (line 304-310) was doing the same redundant `base_type()` call. Stripped for consistency — otherwise the next reader would write a "fix" to one site or the other based on which they noticed. +- **M1 (medium)**: documented the load-bearing invariant at its single producer site. `parse_describe` now has a comment naming readers that depend on `ColumnInfo.type_code` being base-typed, so a future contributor adding a new construct site has a grep-able warning. +- **M2 (medium)**: `_COLLECTION_KIND_MAP` is now `MappingProxyType` (was a plain dict). +- **L1 (low)**: stale "(line 151)" comment reference replaced with a pointer to the named INVARIANT comment. + +### Performance summary + +| Benchmark | Pre | Post | Delta | +|---|---:|---:|---:| +| `parse_tuple_5cols_iso8859` | 2796 ns | 2030 ns | **-27%** | +| `parse_tuple_5cols_utf8` | 2791 ns | 2041 ns | **-27%** | +| `select_bench_table_all` (1k rows) | 1477 µs | 1198 µs | **-19%** | +| `select_with_param` (~50 rows) | 1069 µs | 994 µs | -7% | +| Codec micro-benchmarks (`decode_int`, etc.) | unchanged ±noise | | | +| `cold_connect_disconnect` | unchanged | | | +| `executemany` series | unchanged | | | + +Real-world fetch ceiling on a single connection: 350K rows/sec → 490K rows/sec. + +### Baseline refreshed + +`tests/benchmarks/baseline.json` updated with the new (faster) numbers. Future regressions will be measured against this floor. + ## 2026.05.04.7 — User-facing documentation refresh (Phase 22) The `docs/USAGE.md` predated Phases 17-21, so anyone landing on PyPI was missing scrollable cursors, locale/Unicode, the autocommit cliff finding, and the type-mapping reference. This release closes that gap. diff --git a/pyproject.toml b/pyproject.toml index 623e3cb..a67db5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "informix-db" -version = "2026.05.04.7" +version = "2026.05.04.8" 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 5348dfc..d0b8cd6 100644 --- a/src/informix_db/_resultset.py +++ b/src/informix_db/_resultset.py @@ -21,10 +21,47 @@ column names), read via readPadded. from __future__ import annotations from dataclasses import dataclass +from types import MappingProxyType from ._protocol import IfxStreamReader -from ._types import base_type, is_nullable -from .converters import FIXED_WIDTHS, decode +from ._types import IfxType, base_type, is_nullable +from .converters import ( + FIXED_WIDTHS, + BlobLocator, + ClobLocator, + CollectionValue, + RowValue, + _decode_datetime, + _decode_interval, + decode, +) + +# Module-level type-code constants — lifted out of the hot loop in +# parse_tuple_payload so we don't pay the IntFlag→int conversion per +# column per row. +_TC_CHAR = int(IfxType.CHAR) +_TC_VARCHAR = int(IfxType.VARCHAR) +_TC_NCHAR = int(IfxType.NCHAR) +_TC_NVCHAR = int(IfxType.NVCHAR) +_TC_LVARCHAR = int(IfxType.LVARCHAR) +_TC_DECIMAL = int(IfxType.DECIMAL) +_TC_MONEY = int(IfxType.MONEY) +_TC_DATETIME = int(IfxType.DATETIME) +_TC_INTERVAL = int(IfxType.INTERVAL) +_TC_UDTFIXED = int(IfxType.UDTFIXED) +_TC_UDTVAR = int(IfxType.UDTVAR) +_TC_ROW = int(IfxType.ROW) +_TC_COLLECTION = int(IfxType.COLLECTION) +_TC_SET = int(IfxType.SET) +_TC_MULTISET = int(IfxType.MULTISET) +_TC_LIST = int(IfxType.LIST) + +_COLLECTION_KIND_MAP = MappingProxyType({ + _TC_SET: "set", + _TC_MULTISET: "multiset", + _TC_LIST: "list", + _TC_COLLECTION: "collection", +}) @dataclass @@ -145,6 +182,11 @@ def parse_describe(reader: IfxStreamReader) -> tuple[list[ColumnInfo], dict]: # Walk the string table to find the name at this offset. tail = string_table[fd["field_index"] :].split(b"\x00", 1)[0] name = tail.decode("iso-8859-1") if tail else f"col{len(columns)}" + # INVARIANT: ColumnInfo.type_code is always base-typed (high-bit + # flags stripped). This is the single producer site — every reader + # (parse_tuple_payload, cursor._dereference_blob_columns, etc.) + # depends on this and skips redundant base_type() calls. If you + # ever construct ColumnInfo elsewhere, base_type() the input. columns.append( ColumnInfo( name=name or f"col{len(columns)}", @@ -164,15 +206,23 @@ def parse_describe(reader: IfxStreamReader) -> tuple[list[ColumnInfo], dict]: # Per ``IfxSqli`` row-data extraction (see receiveFastPath case 13/15/16): # CHAR, VARCHAR, NCHAR, NVCHAR all use ``[short length][bytes][pad if odd]`` # inside the tuple blob. LVARCHAR uses a 4-byte length prefix instead. -from ._types import IfxType # noqa: E402 - _LENGTH_PREFIXED_SHORT_TYPES = frozenset({ - int(IfxType.CHAR), - int(IfxType.VARCHAR), - int(IfxType.NCHAR), - int(IfxType.NVCHAR), + _TC_CHAR, + _TC_VARCHAR, + _TC_NCHAR, + _TC_NVCHAR, }) +_COMPOSITE_UDT_TYPES = frozenset({ + _TC_ROW, + _TC_COLLECTION, + _TC_SET, + _TC_MULTISET, + _TC_LIST, +}) + +_NUMERIC_TYPES = frozenset({_TC_DECIMAL, _TC_MONEY}) + def parse_tuple_payload( reader: IfxStreamReader, @@ -212,10 +262,15 @@ def parse_tuple_payload( values: list[object] = [] offset = 0 + # Note: ``col.type_code`` is *already* base-typed by ``parse_describe`` + # (see INVARIANT comment there), so we don't re-strip high-bit flags + # here. The original code called ``base_type(col.type_code)`` per + # column per row — pure waste. Skipping it is the single largest + # savings in this loop. for col in columns: - base = base_type(col.type_code) + tc = col.type_code - if base in _LENGTH_PREFIXED_SHORT_TYPES: + if tc in _LENGTH_PREFIXED_SHORT_TYPES: # In tuple data, VARCHAR/NCHAR/NVCHAR use a SINGLE-BYTE # length prefix (max 255 — IDS VARCHAR's hard limit), not # a short. Empirically verified against the SQ_TUPLE bytes @@ -224,8 +279,7 @@ def parse_tuple_payload( # payload = 09 73 79 73 74 61 62 6c 65 73 # = [byte 9]["systables"] # CHAR is fixed-width per encoded_length — handled below. - if base == int(IfxType.CHAR): - # CHAR(N) is fixed-width; uses encoded_length straight + if tc == _TC_CHAR: width = col.encoded_length raw = payload[offset:offset + width] offset += width @@ -234,10 +288,10 @@ def parse_tuple_payload( offset += 1 raw = payload[offset:offset + length] offset += length - values.append(decode(col.type_code, raw, encoding)) + values.append(decode(tc, raw, encoding)) continue - if base == int(IfxType.LVARCHAR): + if tc == _TC_LVARCHAR: # [int length][bytes][pad if odd] length = int.from_bytes(payload[offset:offset + 4], "big", signed=True) offset += 4 @@ -245,19 +299,19 @@ def parse_tuple_payload( offset += length if length & 1: offset += 1 - values.append(decode(col.type_code, raw, encoding)) + values.append(decode(tc, raw, encoding)) continue # DECIMAL/MONEY: width = ceil(precision/2) + 1, where precision is # the high byte of encoded_length (packed as (precision << 8) | scale). # Per IfxRowColumn.loadColumnData and IfxToJavaDecimal byte sizing. - if base in (int(IfxType.DECIMAL), int(IfxType.MONEY)): + if tc in _NUMERIC_TYPES: precision = (col.encoded_length >> 8) & 0xFF width = (precision + 1) // 2 + 1 raw = payload[offset:offset + width] offset += width try: - values.append(decode(col.type_code, raw)) + values.append(decode(tc, raw)) except NotImplementedError: values.append(raw) continue @@ -266,12 +320,11 @@ def parse_tuple_payload( # high byte of encoded_length (packed as (digit_count << 8) | # (start_TU << 4) | end_TU). The decoder needs the qualifier too, # so we call it directly here rather than via the dispatch. - if base == int(IfxType.DATETIME): + if tc == _TC_DATETIME: digit_count = (col.encoded_length >> 8) & 0xFF width = (digit_count + 1) // 2 + 1 raw = payload[offset:offset + width] offset += width - from .converters import _decode_datetime values.append(_decode_datetime(raw, col.encoded_length)) continue @@ -281,12 +334,11 @@ def parse_tuple_payload( # plus ceil(digit_count/2) digit pairs). Like DATETIME, the # qualifier is needed at decode time, so we bypass the generic # dispatch. - if base == int(IfxType.INTERVAL): + if tc == _TC_INTERVAL: digit_count = (col.encoded_length >> 8) & 0xFF width = (digit_count + 1) // 2 + 1 raw = payload[offset:offset + width] offset += width - from .converters import _decode_interval values.append(_decode_interval(raw, col.encoded_length)) continue @@ -295,8 +347,7 @@ def parse_tuple_payload( # (CLOB) and encoded_length = 72 (locator size). The 72 bytes # we read here are an opaque server-side reference, NOT the # actual data. Phase 10 lets users fetch via lotofile + SQ_FILE. - if base == int(IfxType.UDTFIXED) and col.extended_id in (10, 11): - from .converters import BlobLocator, ClobLocator + if tc == _TC_UDTFIXED and col.extended_id in (10, 11): width = col.encoded_length raw = payload[offset:offset + width] offset += width @@ -315,14 +366,7 @@ def parse_tuple_payload( # We surface the bytes wrapped in a typed object and let the # user parse the textual form themselves. Type codes: # ROW=22, COLLECTION=23, SET=19, MULTISET=20, LIST=21. - if base in ( - int(IfxType.ROW), - int(IfxType.COLLECTION), - int(IfxType.SET), - int(IfxType.MULTISET), - int(IfxType.LIST), - ): - from .converters import CollectionValue, RowValue + if tc in _COMPOSITE_UDT_TYPES: indicator = payload[offset] offset += 1 if indicator == 1: # null @@ -334,19 +378,13 @@ def parse_tuple_payload( offset += 4 raw = bytes(payload[offset:offset + length]) offset += length - if base == int(IfxType.ROW): + if tc == _TC_ROW: values.append(RowValue(raw=raw, schema=col.extended_name)) else: - kind_map = { - int(IfxType.SET): "set", - int(IfxType.MULTISET): "multiset", - int(IfxType.LIST): "list", - int(IfxType.COLLECTION): "collection", - } values.append( CollectionValue( raw=raw, - kind=kind_map[base], + kind=_COLLECTION_KIND_MAP[tc], element_schema=col.extended_name, ) ) @@ -359,7 +397,7 @@ def parse_tuple_payload( # verified against ``SELECT lotofile(...)`` row data — the # leading ``00`` is null indicator (0=not null, 1=null per UDT # convention). - if base == int(IfxType.UDTVAR) and col.extended_name == "lvarchar": + if tc == _TC_UDTVAR and col.extended_name == "lvarchar": indicator = payload[offset] offset += 1 if indicator == 1: @@ -377,7 +415,7 @@ def parse_tuple_payload( continue # Fixed-width types - width = FIXED_WIDTHS.get(base) + width = FIXED_WIDTHS.get(tc) if width is None: # Phase 6+ types (DATETIME, INTERVAL, BLOBs) — fall back # to encoded_length and surface raw bytes. @@ -385,7 +423,7 @@ def parse_tuple_payload( raw = payload[offset:offset + width] offset += width try: - values.append(decode(col.type_code, raw, encoding)) + values.append(decode(tc, raw, encoding)) except NotImplementedError: values.append(raw) return tuple(values) diff --git a/src/informix_db/cursors.py b/src/informix_db/cursors.py index f6422d2..c7860b7 100644 --- a/src/informix_db/cursors.py +++ b/src/informix_db/cursors.py @@ -301,12 +301,15 @@ class Cursor: and the response is one or more ``SQ_BLOB`` (39) chunks ending with a zero-length terminator. """ - from ._types import IfxType, base_type + from ._types import IfxType + # ColumnInfo.type_code is base-typed by construction + # (see parse_describe / INVARIANT comment) — no base_type() needed. + byte_text_codes = (int(IfxType.BYTE), int(IfxType.TEXT)) blob_indices = [ - (i, base_type(c.type_code)) + (i, c.type_code) for i, c in enumerate(self._columns) - if base_type(c.type_code) in (int(IfxType.BYTE), int(IfxType.TEXT)) + if c.type_code in byte_text_codes ] if not blob_indices: return diff --git a/tests/benchmarks/baseline.json b/tests/benchmarks/baseline.json index 0abd8b7..a23bdfb 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.4323 GHz", - "hz_actual_friendly": "5.4323 GHz", + "hz_advertised_friendly": "5.3056 GHz", + "hz_actual_friendly": "5.3056 GHz", "hz_advertised": [ - 5432299000, + 5305567000, 0 ], "hz_actual": [ - 5432299000, + 5305567000, 0 ], "model": 68, @@ -227,9 +227,9 @@ } }, "commit_info": { - "id": "90ce035a00ab2776cbccad314af68d245f1e913b", - "time": "2026-05-04T17:21:12-06:00", - "author_time": "2026-05-04T17:21:12-06:00", + "id": "0e0dfcba26d06bc99220eee23d6da320d6db31d0", + "time": "2026-05-04T17:33:37-06:00", + "author_time": "2026-05-04T17:33:37-06:00", "dirty": true, "project": "python-library", "branch": "main" @@ -251,22 +251,22 @@ "warmup": false }, "stats": { - "min": 0.0001783499028533697, - "max": 0.0037694860948249698, - "mean": 0.0002708047498068165, - "stddev": 0.0001398595253029065, - "rounds": 920, - "median": 0.00024159951135516167, - "iqr": 0.00010358949657529593, - "q1": 0.00020531500922515988, - "q3": 0.0003089045058004558, - "iqr_outliers": 24, - "stddev_outliers": 53, - "outliers": "53;24", - "ld15iqr": 0.0001783499028533697, - "hd15iqr": 0.000472119078040123, - "ops": 3692.697416545937, - "total": 0.24914036982227117, + "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, "iterations": 1 } }, @@ -286,22 +286,22 @@ "warmup": false }, "stats": { - "min": 0.0033279670169577003, - "max": 0.009101188974454999, - "mean": 0.004628980516309978, - "stddev": 0.001321010090952204, - "rounds": 51, - "median": 0.004433745052665472, - "iqr": 0.0012122082989662886, - "q1": 0.0037467457295861095, - "q3": 0.004958954028552398, - "iqr_outliers": 4, - "stddev_outliers": 5, - "outliers": "5;4", - "ld15iqr": 0.0033279670169577003, - "hd15iqr": 0.00792649108916521, - "ops": 216.0302892778552, - "total": 0.23607800633180887, + "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, "iterations": 1 } }, @@ -321,22 +321,22 @@ "warmup": false }, "stats": { - "min": 1.552992034703493e-07, - "max": 9.124004282057285e-07, - "mean": 1.697415664394928e-07, - "stddev": 2.1092413887246777e-08, - "rounds": 46105, - "median": 1.655996311455965e-07, - "iqr": 6.3003972172736995e-09, - "q1": 1.6330042853951454e-07, - "q3": 1.6960082575678824e-07, - "iqr_outliers": 2795, - "stddev_outliers": 1970, - "outliers": "1970;2795", - "ld15iqr": 1.552992034703493e-07, - "hd15iqr": 1.790898386389017e-07, - "ops": 5891308.893726195, - "total": 0.007825934920692817, + "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, "iterations": 100 } }, @@ -356,23 +356,23 @@ "warmup": false }, "stats": { - "min": 1.536643443008264e-07, - "max": 2.973666414618492e-06, - "mean": 1.66776047066651e-07, - "stddev": 3.477156332297996e-08, - "rounds": 195311, - "median": 1.6200356185436248e-07, - "iqr": 4.334530482689541e-09, - "q1": 1.6033494224150975e-07, - "q3": 1.646694727241993e-07, - "iqr_outliers": 11999, - "stddev_outliers": 7420, - "outliers": "7420;11999", - "ld15iqr": 1.5399806822339693e-07, - "hd15iqr": 1.7133230964342753e-07, - "ops": 5996064.888145216, - "total": 0.032573196528634676, - "iterations": 30 + "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 } }, { @@ -391,22 +391,22 @@ "warmup": false }, "stats": { - "min": 1.6692166145031268e-07, - "max": 3.5261529354521863e-06, - "mean": 1.8541564986363696e-07, - "stddev": 4.0746058984269045e-08, - "rounds": 199206, - "median": 1.7923034297732207e-07, - "iqr": 3.846183132666796e-09, - "q1": 1.7730949016717764e-07, - "q3": 1.8115567329984444e-07, - "iqr_outliers": 14741, - "stddev_outliers": 8889, - "outliers": "8889;14741", - "ld15iqr": 1.715424542243664e-07, - "hd15iqr": 1.8692718675503363e-07, - "ops": 5393288.003118643, - "total": 0.036935909946735665, + "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 } }, @@ -426,22 +426,22 @@ "warmup": false }, "stats": { - "min": 1.5533296391367912e-07, - "max": 5.582331990202268e-06, - "mean": 1.7290553887433694e-07, - "stddev": 4.3992245312702247e-08, - "rounds": 196077, - "median": 1.6533304005861283e-07, - "iqr": 4.6643738945325145e-09, - "q1": 1.6366830095648767e-07, - "q3": 1.6833267485102018e-07, - "iqr_outliers": 14681, - "stddev_outliers": 10089, - "outliers": "10089;14681", - "ld15iqr": 1.5699770301580428e-07, - "hd15iqr": 1.7533311620354651e-07, - "ops": 5783504.718878745, - "total": 0.03390279934586336, + "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 } }, @@ -461,22 +461,22 @@ "warmup": false }, "stats": { - "min": 4.4994521886110306e-07, - "max": 5.99490012973547e-05, - "mean": 4.997973695114113e-07, - "stddev": 1.9661595195578896e-07, - "rounds": 149925, + "min": 4.5995693653821945e-07, + "max": 1.5629921108484268e-05, + "mean": 5.214427266764096e-07, + "stddev": 2.9467465403642604e-07, + "rounds": 116823, "median": 4.899920895695686e-07, - "iqr": 3.9814040064811707e-08, - "q1": 4.700850695371628e-07, - "q3": 5.098991096019745e-07, - "iqr_outliers": 4099, - "stddev_outliers": 1535, - "outliers": "1535;4099", - "ld15iqr": 4.4994521886110306e-07, - "hd15iqr": 5.699694156646729e-07, - "ops": 2000810.850560445, - "total": 0.07493212062399834, + "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, "iterations": 1 } }, @@ -496,23 +496,23 @@ "warmup": false }, "stats": { - "min": 1.567738851712596e-07, - "max": 1.403064497055546e-05, - "mean": 1.6506310570564836e-07, - "stddev": 3.4999582115629985e-08, - "rounds": 196082, - "median": 1.6322554720024908e-07, - "iqr": 1.937751808474152e-09, - "q1": 1.6225667129601201e-07, - "q3": 1.6419442310448617e-07, - "iqr_outliers": 11504, - "stddev_outliers": 3249, - "outliers": "3249;11504", - "ld15iqr": 1.5935379891626296e-07, - "hd15iqr": 1.6738645612232146e-07, - "ops": 6058289.014525556, - "total": 0.03236590389297494, - "iterations": 31 + "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 } }, { @@ -531,22 +531,22 @@ "warmup": false }, "stats": { - "min": 1.7300015315413474e-07, - "max": 5.746900569647551e-07, - "mean": 1.8009804110252565e-07, - "stddev": 6.7639479585228705e-09, - "rounds": 55618, - "median": 1.792993862181902e-07, - "iqr": 2.0000152289867475e-09, - "q1": 1.7829937860369681e-07, - "q3": 1.8029939383268356e-07, - "iqr_outliers": 2142, - "stddev_outliers": 1315, - "outliers": "1315;2142", - "ld15iqr": 1.752993557602167e-07, - "hd15iqr": 1.8330058082938194e-07, - "ops": 5552531.242861899, - "total": 0.010016692850040271, + "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, "iterations": 100 } }, @@ -566,23 +566,23 @@ "warmup": false }, "stats": { - "min": 1.974985934793949e-07, - "max": 1.2000833521597087e-05, - "mean": 2.105730723877986e-07, - "stddev": 3.294005306439554e-08, - "rounds": 193799, - "median": 2.075006098796924e-07, - "iqr": 4.588703935345023e-09, - "q1": 2.0583199026683965e-07, - "q3": 2.1042069420218468e-07, - "iqr_outliers": 11045, - "stddev_outliers": 3374, - "outliers": "3374;11045", - "ld15iqr": 1.991623624538382e-07, - "hd15iqr": 2.1745897053430477e-07, - "ops": 4748945.288495225, - "total": 0.04080885085568298, - "iterations": 24 + "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 } }, { @@ -601,22 +601,22 @@ "warmup": false }, "stats": { - "min": 9.495008271187544e-08, - "max": 8.562498260289431e-07, - "mean": 9.819238487790007e-08, - "stddev": 8.207935436892014e-09, - "rounds": 51335, - "median": 9.700015652924776e-08, - "iqr": 8.993083611130741e-10, - "q1": 9.660026989877224e-08, - "q3": 9.749957825988531e-08, - "iqr_outliers": 2476, - "stddev_outliers": 1709, - "outliers": "1709;2476", - "ld15iqr": 9.529991075396538e-08, - "hd15iqr": 9.884999599307776e-08, - "ops": 10184089.135257041, - "total": 0.005040706077707, + "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, "iterations": 200 } }, @@ -636,22 +636,22 @@ "warmup": false }, "stats": { - "min": 4.200264811515808e-07, - "max": 6.139976903796196e-06, - "mean": 4.615799622473153e-07, - "stddev": 8.453654720518955e-08, - "rounds": 126742, - "median": 4.5995693653821945e-07, + "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.4994521886110306e-07, - "q3": 4.600733518600464e-07, - "iqr_outliers": 8787, - "stddev_outliers": 2251, - "outliers": "2251;8787", - "ld15iqr": 4.390021786093712e-07, - "hd15iqr": 4.789326339960098e-07, - "ops": 2166471.861411086, - "total": 0.05850156757514924, + "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, "iterations": 1 } }, @@ -671,22 +671,22 @@ "warmup": false }, "stats": { - "min": 3.7949648685753344e-07, - "max": 4.142004763707519e-06, - "mean": 4.0244505908328793e-07, - "stddev": 3.517347358384737e-08, - "rounds": 119047, - "median": 3.964989446103573e-07, - "iqr": 8.99890437722203e-09, - "q1": 3.925000783056021e-07, - "q3": 4.014989826828241e-07, - "iqr_outliers": 4942, - "stddev_outliers": 3931, - "outliers": "3931;4942", - "ld15iqr": 3.7949648685753344e-07, - "hd15iqr": 4.1499733924865725e-07, - "ops": 2484811.224364032, - "total": 0.04790987694868818, + "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, "iterations": 20 } }, @@ -706,23 +706,23 @@ "warmup": false }, "stats": { - "min": 1.2991949915885925e-07, - "max": 4.639965482056141e-06, - "mean": 1.5344735326122993e-07, - "stddev": 3.9628501777315876e-08, - "rounds": 199206, - "median": 1.5005934983491898e-07, - "iqr": 1.1641532182693481e-10, - "q1": 1.4994293451309204e-07, - "q3": 1.5005934983491898e-07, - "iqr_outliers": 78209, - "stddev_outliers": 3670, - "outliers": "3670;78209", - "ld15iqr": 1.4994293451309204e-07, - "hd15iqr": 1.5890691429376602e-07, - "ops": 6516893.115110252, - "total": 0.03056763345375657, - "iterations": 1 + "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 } }, { @@ -741,22 +741,22 @@ "warmup": false }, "stats": { - "min": 2.200249582529068e-07, - "max": 1.8549966625869274e-05, - "mean": 2.495290070327044e-07, - "stddev": 6.700914428761149e-08, - "rounds": 175750, - "median": 2.4994369596242905e-07, - "iqr": 1.0011717677116394e-08, - "q1": 2.400483936071396e-07, - "q3": 2.50060111284256e-07, - "iqr_outliers": 10436, - "stddev_outliers": 1755, - "outliers": "1755;10436", - "ld15iqr": 2.2992026060819626e-07, - "hd15iqr": 2.689193934202194e-07, - "ops": 4007550.1116747344, - "total": 0.043854722985997796, + "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, + "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, "iterations": 1 } }, @@ -776,22 +776,22 @@ "warmup": false }, "stats": { - "min": 1.8599675968289375e-06, - "max": 1.343991607427597e-05, - "mean": 1.9514378415340784e-06, - "stddev": 2.2459184590519486e-07, - "rounds": 61501, - "median": 1.920037902891636e-06, - "iqr": 2.991873770952225e-08, - "q1": 1.9100261852145195e-06, - "q3": 1.9399449229240417e-06, - "iqr_outliers": 2196, - "stddev_outliers": 1641, - "outliers": "1641;2196", - "ld15iqr": 1.8689315766096115e-06, - "hd15iqr": 1.9889557734131813e-06, - "ops": 512442.6608504592, - "total": 0.12001537869218737, + "min": 1.8399441614747047e-06, + "max": 7.521000225096941e-05, + "mean": 1.979959211457151e-06, + "stddev": 6.163066006137501e-07, + "rounds": 63013, + "median": 1.9100261852145195e-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, "iterations": 1 } }, @@ -811,22 +811,22 @@ "warmup": false }, "stats": { - "min": 2.620043233036995e-06, - "max": 1.5789992175996304e-05, - "mean": 2.7960869296309257e-06, - "stddev": 2.9548134292988817e-07, - "rounds": 39124, - "median": 2.7599744498729706e-06, - "iqr": 5.995389074087143e-08, - "q1": 2.7300557121634483e-06, - "q3": 2.7900096029043198e-06, - "iqr_outliers": 1293, - "stddev_outliers": 1018, - "outliers": "1018;1293", - "ld15iqr": 2.649961970746517e-06, - "hd15iqr": 2.8799986466765404e-06, - "ops": 357642.671764857, - "total": 0.10939410503488034, + "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, "iterations": 1 } }, @@ -846,22 +846,22 @@ "warmup": false }, "stats": { - "min": 2.620043233036995e-06, - "max": 2.8469949029386044e-05, - "mean": 2.7905499414258814e-06, - "stddev": 3.3678126483548525e-07, - "rounds": 62422, - "median": 2.749962732195854e-06, - "iqr": 5.902256816625595e-08, - "q1": 2.720043994486332e-06, - "q3": 2.779066562652588e-06, - "iqr_outliers": 2264, - "stddev_outliers": 1699, - "outliers": "1699;2264", - "ld15iqr": 2.6399502530694008e-06, - "hd15iqr": 2.869986928999424e-06, - "ops": 358352.3036642133, - "total": 0.17419170844368637, + "min": 1.919921487569809e-06, + "max": 8.665001951158047e-05, + "mean": 2.0710582509776077e-06, + "stddev": 5.856449837511621e-07, + "rounds": 127389, + "median": 2.019922249019146e-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, "iterations": 1 } }, @@ -881,22 +881,22 @@ "warmup": false }, "stats": { - "min": 0.001582358032464981, - "max": 0.0023439470678567886, - "mean": 0.0017878168699458057, - "stddev": 9.797651240016688e-05, - "rounds": 243, - "median": 0.0017855080077424645, - "iqr": 0.00012171000707894564, - "q1": 0.0017153230146504939, - "q3": 0.0018370330217294395, - "iqr_outliers": 4, - "stddev_outliers": 70, - "outliers": "70;4", - "ld15iqr": 0.001582358032464981, - "hd15iqr": 0.0020228370558470488, - "ops": 559.3414050457601, - "total": 0.4344394993968308, + "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, "iterations": 1 } }, @@ -916,22 +916,22 @@ "warmup": false }, "stats": { - "min": 0.16832035908009857, - "max": 0.1755698589840904, - "mean": 0.17103146946257247, - "stddev": 0.0026583298272997696, + "min": 0.16403006296604872, + "max": 0.17896402801852673, + "mean": 0.16753320356032678, + "stddev": 0.005138313332113908, "rounds": 7, - "median": 0.17046913609374315, - "iqr": 0.003929688478820026, - "q1": 0.16898605454480276, - "q3": 0.17291574302362278, - "iqr_outliers": 0, - "stddev_outliers": 3, - "outliers": "3;0", - "ld15iqr": 0.16832035908009857, - "hd15iqr": 0.1755698589840904, - "ops": 5.846877204190976, - "total": 1.1972202862380072, + "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, "iterations": 1 } }, @@ -951,22 +951,22 @@ "warmup": false }, "stats": { - "min": 1.7241007370175794, - "max": 1.8025506250560284, - "mean": 1.770115462364629, - "stddev": 0.040949964893151496, + "min": 1.6979640549980104, + "max": 1.8137637979816645, + "mean": 1.741307493338051, + "stddev": 0.06315112316560473, "rounds": 3, - "median": 1.783695025020279, - "iqr": 0.05883741602883674, - "q1": 1.7389993090182543, - "q3": 1.797836725047091, + "median": 1.712194627034478, + "iqr": 0.0868498072377406, + "q1": 1.7015216980071273, + "q3": 1.7883715052448679, "iqr_outliers": 0, "stddev_outliers": 1, "outliers": "1;0", - "ld15iqr": 1.7241007370175794, - "hd15iqr": 1.8025506250560284, - "ops": 0.5649348990286422, - "total": 5.310346387093887, + "ld15iqr": 1.6979640549980104, + "hd15iqr": 1.8137637979816645, + "ops": 0.5742811099279315, + "total": 5.223922480014153, "iterations": 1 } }, @@ -986,22 +986,22 @@ "warmup": false }, "stats": { - "min": 0.029487275052815676, - "max": 0.031187782995402813, - "mean": 0.03018106399880101, - "stddev": 0.0008923988615717756, + "min": 0.02879249001853168, + "max": 0.035027747973799706, + "mean": 0.03150460566394031, + "stddev": 0.0031957680813884007, "rounds": 3, - "median": 0.02986813394818455, - "iqr": 0.001275380956940353, - "q1": 0.029582489776657894, - "q3": 0.030857870733598247, + "median": 0.030693578999489546, + "iqr": 0.004676443466451019, + "q1": 0.029267762263771147, + "q3": 0.033944205730222166, "iqr_outliers": 0, "stddev_outliers": 1, "outliers": "1;0", - "ld15iqr": 0.029487275052815676, - "hd15iqr": 0.031187782995402813, - "ops": 33.133358056552495, - "total": 0.09054319199640304, + "ld15iqr": 0.02879249001853168, + "hd15iqr": 0.035027747973799706, + "ops": 31.741390787969287, + "total": 0.09451381699182093, "iterations": 1 } }, @@ -1021,22 +1021,22 @@ "warmup": false }, "stats": { - "min": 0.010703847045078874, - "max": 0.010994946002028883, - "mean": 0.010857723001390696, - "stddev": 0.00012220593763959052, + "min": 0.010372666991315782, + "max": 0.012186535983346403, + "mean": 0.01076945241075009, + "stddev": 0.0007926438816564111, "rounds": 5, - "median": 0.01081350794993341, - "iqr": 0.000195654749404639, - "q1": 0.010780639509903267, - "q3": 0.010976294259307906, - "iqr_outliers": 0, - "stddev_outliers": 2, - "outliers": "2;0", - "ld15iqr": 0.010703847045078874, - "hd15iqr": 0.010994946002028883, - "ops": 92.10034183704231, - "total": 0.05428861500695348, + "median": 0.010428816080093384, + "iqr": 0.0004787805082742125, + "q1": 0.01040272624231875, + "q3": 0.010881506750592962, + "iqr_outliers": 1, + "stddev_outliers": 1, + "outliers": "1;1", + "ld15iqr": 0.010372666991315782, + "hd15iqr": 0.012186535983346403, + "ops": 92.85523180378213, + "total": 0.053847262053750455, "iterations": 1 } }, @@ -1056,22 +1056,22 @@ "warmup": false }, "stats": { - "min": 0.00010902993381023407, - "max": 0.002848736010491848, - "mean": 0.00021822520665460928, - "stddev": 0.0001375125435240596, - "rounds": 2183, - "median": 0.00018530897796154022, - "iqr": 9.743723785504699e-05, - "q1": 0.00014857493806630373, - "q3": 0.0002460121759213507, - "iqr_outliers": 111, - "stddev_outliers": 165, - "outliers": "165;111", - "ld15iqr": 0.00010902993381023407, - "hd15iqr": 0.00039244897197932005, - "ops": 4582.422055316121, - "total": 0.4763856261270121, + "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, "iterations": 1 } }, @@ -1091,22 +1091,22 @@ "warmup": false }, "stats": { - "min": 0.00021435902453958988, - "max": 0.0026991659542545676, - "mean": 0.00034451136280134787, - "stddev": 0.0001381192549398773, - "rounds": 1734, - "median": 0.000307839538436383, - "iqr": 0.0001273100497201085, - "q1": 0.0002589399227872491, - "q3": 0.0003862499725073576, - "iqr_outliers": 81, - "stddev_outliers": 186, - "outliers": "186;81", - "ld15iqr": 0.00021435902453958988, - "hd15iqr": 0.0005773489829152822, - "ops": 2902.661879911984, - "total": 0.5973827030975372, + "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, "iterations": 1 } }, @@ -1126,22 +1126,22 @@ "warmup": false }, "stats": { - "min": 0.00010571896564215422, - "max": 0.0014337979955598712, - "mean": 0.00016123567918431363, - "stddev": 6.081706925207678e-05, - "rounds": 3602, - "median": 0.00014233950059860945, - "iqr": 6.208906415849924e-05, - "q1": 0.0001211799681186676, - "q3": 0.00018326903227716684, - "iqr_outliers": 140, - "stddev_outliers": 436, - "outliers": "436;140", - "ld15iqr": 0.00010571896564215422, - "hd15iqr": 0.00027650000993162394, - "ops": 6202.101204019913, - "total": 0.5807709164218977, + "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, "iterations": 1 } }, @@ -1161,22 +1161,22 @@ "warmup": false }, "stats": { - "min": 0.0001464600209146738, - "max": 0.0006670691072940826, - "mean": 0.00020406637762734778, - "stddev": 5.242213281716161e-05, - "rounds": 2919, - "median": 0.00018970994278788567, - "iqr": 6.735578062944114e-05, - "q1": 0.00016244172002188861, - "q3": 0.00022979750065132976, - "iqr_outliers": 85, - "stddev_outliers": 525, - "outliers": "525;85", - "ld15iqr": 0.0001464600209146738, - "hd15iqr": 0.00033088994678109884, - "ops": 4900.366300548209, - "total": 0.5956697562942281, + "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, "iterations": 1 } }, @@ -1196,22 +1196,22 @@ "warmup": false }, "stats": { - "min": 0.0012891979422420263, - "max": 0.002537296968512237, - "mean": 0.0014767767646464644, - "stddev": 0.00015889450439075735, - "rounds": 536, - "median": 0.0014329130062833428, - "iqr": 0.00017965061124414206, - "q1": 0.0013673279318027198, - "q3": 0.0015469785430468619, - "iqr_outliers": 23, - "stddev_outliers": 110, - "outliers": "110;23", - "ld15iqr": 0.0012891979422420263, - "hd15iqr": 0.0018201080383732915, - "ops": 677.1504156482289, - "total": 0.7915523458505049, + "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, "iterations": 1 } }, @@ -1231,26 +1231,26 @@ "warmup": false }, "stats": { - "min": 0.0008895490318536758, - "max": 0.001708118012174964, - "mean": 0.0010690036180604182, - "stddev": 0.00012057836413943589, - "rounds": 729, - "median": 0.001042668940499425, - "iqr": 0.0001435203303117305, - "q1": 0.0009819729311857373, - "q3": 0.0011254932614974678, - "iqr_outliers": 28, - "stddev_outliers": 172, - "outliers": "172;28", - "ld15iqr": 0.0008895490318536758, - "hd15iqr": 0.0013541990192607045, - "ops": 935.4505289835995, - "total": 0.7793036375660449, + "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, "iterations": 1 } } ], - "datetime": "2026-05-04T23:25:30.942621+00:00", + "datetime": "2026-05-04T23:51:33.343368+00:00", "version": "5.2.3" } \ No newline at end of file