<!doctype html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>WBT · Position Risk 性能报告</title><style>
body{font:16px/1.65 system-ui,sans-serif;background:#f3f6fa;color:#20304a;margin:0}
main{max-width:1320px;margin:40px auto;padding:0 28px}h1{font-size:36px;line-height:1.2}
h2{margin-top:34px}header{background:#102a43;color:#fff;padding:36px;border-radius:16px}
.tag{color:#67e8cf}section,details{background:white;padding:20px 24px;border-radius:12px;margin:18px 0}
.scroll,details{overflow:auto}table{border-collapse:collapse;width:100%;font-size:14px}th,td{padding:10px;border-bottom:1px solid #dfe7ef;text-align:right;white-space:nowrap}
th:first-child,td:first-child{text-align:left}th{background:#eef4f9}pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px}
summary{cursor:pointer;font-weight:600}code{background:#e8eef4;padding:2px 5px}.note{border-left:4px solid #13a88a}
</style></head><body><main><header><div class="tag">WBT / SKZ-721 · RELEASE BENCHMARK</div>
<h1>持仓风险度:Rust 与同算法 Python</h1><p>先验证语义,再测量性能。不预设加速结论,不把算法差异计入语言加速。</p></header>
<section class="note"><h2>结论边界</h2><p>以下是本机、固定 mock、预热后重复测量的结果。
Python 对照按 Rust 的「稳定排序 + 聚合树」重新实现,不使用飞书原 Python 源码。
这不是对所有 pandas/NumPy 实现或所有硬件的速度承诺;小输入可能由转换开销主导。
速比 = Python 中位数 / Rust 中位数,小于 1 表示 Rust 更慢。</p></section>
<section class="scroll"><h2>主结果(中位数,毫秒)</h2><table><tr><th>场景</th><th>N 行</th><th>T 时间</th><th>S 品种</th>
<th>Python E2E</th><th>Rust E2E</th><th>Python 核心</th><th>Rust 核心</th><th>转换合计</th><th>E2E 速比</th><th>核心速比</th></tr><tr><td>tiny</td><td>12</td><td>4</td><td>3</td><td>0.950</td><td>1.027</td><td>0.507</td><td>0.008</td><td>0.444</td><td>0.93×</td><td>65.45×</td></tr><tr><td>small-dense</td><td>1,000</td><td>100</td><td>10</td><td>2.962</td><td>1.916</td><td>1.764</td><td>0.061</td><td>0.781</td><td>1.55×</td><td>29.10×</td></tr><tr><td>dense-100k</td><td>100,000</td><td>1,000</td><td>100</td><td>209.156</td><td>17.040</td><td>199.336</td><td>6.508</td><td>2.539</td><td>12.27×</td><td>30.63×</td></tr><tr><td>dense-500k</td><td>500,000</td><td>2,000</td><td>250</td><td>1199.793</td><td>68.580</td><td>1176.004</td><td>34.103</td><td>8.851</td><td>17.49×</td><td>34.48×</td></tr><tr><td>sparse-1000-symbols</td><td>60,000</td><td>20,000</td><td>1,000</td><td>217.422</td><td>15.149</td><td>210.021</td><td>5.484</td><td>2.215</td><td>14.35×</td><td>38.30×</td></tr><tr><td>shuffled-duplicates</td><td>44,000</td><td>2,000</td><td>100</td><td>125.517</td><td>11.487</td><td>118.490</td><td>3.798</td><td>1.843</td><td>10.93×</td><td>31.20×</td></tr></table></section>
<section><h2>计时范围与公平性</h2><ul>
<li>两端共享相同原始输入、输入规范化、七个 float64 指标和 datetime 输出契约。逐场景断言所有列数值一致(rtol/atol 1e-12、NaN 同位)。</li>
<li>E2E 是实际公共调用独立计时,包含输入规范化、计算、输出 DataFrame;Rust 还包含四段 Arrow IPC 转换与 PyO3 调用。</li>
<li>核心 = 已规范化的本语言 DataFrame → 输出 DataFrame:包含字段提取、品种编码、校验(Rust)、稳定排序、树更新、结果物化;不是仅树循环。</li>
<li>Rust 内部 Instant 分别测 IPC 解码、完整核心、IPC 编码;普通公共调用不插入计时器。Python 核心独立计时。</li>
<li>转换合计 = Python IPC 编码 + Rust IPC 解码 + Rust IPC 编码 + Python IPC 解码的每轮分段和;不把 E2E−核心的噪声残差当作转换。</li>
<li>分段来自独立调用,不应精确相加为 E2E。PyO3 调用/返回字节拷贝、计时器等未归入四段转换;native_profile_call 给出整个仪表化边界调用供检查。</li>
<li>固定 seed、同一进程、预热、每轮随机交错顺序、保留全部样本及 min/median/p95。数据生成、正确性断言、导入、编译和 HTML 生成不计时。</li>
<li>这是墙钟耗时,未绑定 CPU、未控制系统负载/温度;少量重复的 P95 只是描述统计,不是置信区间。未测峰值内存或并发吞吐。</li>
</ul></section>
<section><h2>实现与正确性</h2><p>时间必须先升序;品种未出现前为空仓,NaN 沿用历史,跨日不断仓,零表示平仓。
同时间同品种最后非缺失值胜出。允许杠杆;空头为零时多空比为 NaN。空输入保留八列,拒绝缺失键和无限权重,保留纳秒与时区。</p>
<p>连续 Vec 聚合树维护总/多/空/净/最大/平方和,更新复杂度 O(log S),总复杂度 O(N log N + N log S + T),空间 O(N+S+T),不创建 T×S 网格。
重算父节点避免历史增减累积误差;float64 仍存在舍入与溢出限制。没有 unsafe、fast-math 或并行归约。</p>
<p>测试使用手算预期和独立稠密历史 oracle(每时刻每品种重选历史最后有效记录并用 math.fsum),不只验证两棵树互相一致。
覆盖乱序、隔夜、重复、缺失、全空仓、杠杆、纳秒/时区、空输入、错误输入、大仓平仓恢复小仓;具体运行证据见随 PR 提交的 verification.txt。</p>
<p>实现前参考 Rust Book iterator performance、Cargo profiles、PyO3 0.28 performance/parallelism 官方文档;来源及设计取舍见 docs/position_risk.md。</p></section>
<h2>分场景分层数据</h2><details><summary>tiny — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>0.8232</td><td>1.0265</td><td>1.3023</td></tr><tr><td>python_e2e</td><td>0.7763</td><td>0.9500</td><td>1.7912</td></tr><tr><td>python_core</td><td>0.3827</td><td>0.5072</td><td>0.5402</td></tr><tr><td>normalize</td><td>0.4309</td><td>0.5153</td><td>1.2151</td></tr><tr><td>python_ipc_encode</td><td>0.1385</td><td>0.1607</td><td>0.2460</td></tr><tr><td>python_ipc_decode</td><td>0.1926</td><td>0.2273</td><td>1.2880</td></tr><tr><td>native_profile_call</td><td>0.0340</td><td>0.0463</td><td>0.0738</td></tr><tr><td>rust_ipc_decode</td><td>0.0097</td><td>0.0153</td><td>0.0265</td></tr><tr><td>rust_core</td><td>0.0054</td><td>0.0077</td><td>0.0131</td></tr><tr><td>rust_ipc_encode</td><td>0.0143</td><td>0.0185</td><td>0.0276</td></tr><tr><td>conversion_total</td><td>0.3664</td><td>0.4437</td><td>1.5008</td></tr></table></details><details><summary>small-dense — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>1.5763</td><td>1.9156</td><td>2.2505</td></tr><tr><td>python_e2e</td><td>2.6614</td><td>2.9622</td><td>3.2571</td></tr><tr><td>python_core</td><td>1.6909</td><td>1.7645</td><td>2.0544</td></tr><tr><td>normalize</td><td>0.9590</td><td>1.0488</td><td>1.2857</td></tr><tr><td>python_ipc_encode</td><td>0.2959</td><td>0.4523</td><td>0.5376</td></tr><tr><td>python_ipc_decode</td><td>0.1698</td><td>0.2302</td><td>0.3919</td></tr><tr><td>native_profile_call</td><td>0.0833</td><td>0.1238</td><td>0.1522</td></tr><tr><td>rust_ipc_decode</td><td>0.0157</td><td>0.0301</td><td>0.0447</td></tr><tr><td>rust_core</td><td>0.0479</td><td>0.0606</td><td>0.0688</td></tr><tr><td>rust_ipc_encode</td><td>0.0112</td><td>0.0241</td><td>0.0318</td></tr><tr><td>conversion_total</td><td>0.5034</td><td>0.7814</td><td>0.9076</td></tr></table></details><details><summary>dense-100k — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>16.2412</td><td>17.0403</td><td>17.9192</td></tr><tr><td>python_e2e</td><td>205.8595</td><td>209.1555</td><td>214.3437</td></tr><tr><td>python_core</td><td>197.9344</td><td>199.3360</td><td>207.2388</td></tr><tr><td>normalize</td><td>7.4495</td><td>7.7815</td><td>8.4483</td></tr><tr><td>python_ipc_encode</td><td>0.9435</td><td>1.2309</td><td>1.3655</td></tr><tr><td>python_ipc_decode</td><td>0.4702</td><td>0.5528</td><td>0.7523</td></tr><tr><td>native_profile_call</td><td>7.0483</td><td>7.2905</td><td>7.4663</td></tr><tr><td>rust_ipc_decode</td><td>0.6601</td><td>0.7183</td><td>0.8888</td></tr><tr><td>rust_core</td><td>6.2471</td><td>6.5075</td><td>6.6971</td></tr><tr><td>rust_ipc_encode</td><td>0.0360</td><td>0.0411</td><td>0.0551</td></tr><tr><td>conversion_total</td><td>2.3325</td><td>2.5390</td><td>2.8324</td></tr></table></details><details><summary>dense-500k — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>63.7729</td><td>68.5805</td><td>70.7208</td></tr><tr><td>python_e2e</td><td>1162.1901</td><td>1199.7927</td><td>1213.5771</td></tr><tr><td>python_core</td><td>1153.8702</td><td>1176.0042</td><td>1273.2021</td></tr><tr><td>normalize</td><td>23.2440</td><td>24.3454</td><td>26.0368</td></tr><tr><td>python_ipc_encode</td><td>4.4698</td><td>4.5612</td><td>5.0755</td></tr><tr><td>python_ipc_decode</td><td>0.3425</td><td>0.5198</td><td>0.7877</td></tr><tr><td>native_profile_call</td><td>35.7819</td><td>37.8151</td><td>38.9256</td></tr><tr><td>rust_ipc_decode</td><td>3.6118</td><td>3.6997</td><td>4.2053</td></tr><tr><td>rust_core</td><td>32.0814</td><td>34.1031</td><td>34.6761</td></tr><tr><td>rust_ipc_encode</td><td>0.0425</td><td>0.0474</td><td>0.0603</td></tr><tr><td>conversion_total</td><td>8.7055</td><td>8.8509</td><td>9.8016</td></tr></table></details><details><summary>sparse-1000-symbols — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>14.9190</td><td>15.1485</td><td>15.4126</td></tr><tr><td>python_e2e</td><td>215.4547</td><td>217.4219</td><td>234.9833</td></tr><tr><td>python_core</td><td>207.7636</td><td>210.0207</td><td>212.1717</td></tr><tr><td>normalize</td><td>6.2292</td><td>7.3080</td><td>8.0323</td></tr><tr><td>python_ipc_encode</td><td>0.8119</td><td>0.9981</td><td>1.0465</td></tr><tr><td>python_ipc_decode</td><td>0.5650</td><td>0.6511</td><td>0.9319</td></tr><tr><td>native_profile_call</td><td>5.2993</td><td>6.1134</td><td>6.2363</td></tr><tr><td>rust_ipc_decode</td><td>0.4153</td><td>0.4389</td><td>0.4622</td></tr><tr><td>rust_core</td><td>4.7268</td><td>5.4838</td><td>5.6393</td></tr><tr><td>rust_ipc_encode</td><td>0.0946</td><td>0.1132</td><td>0.1426</td></tr><tr><td>conversion_total</td><td>1.9607</td><td>2.2152</td><td>2.5435</td></tr></table></details><details><summary>shuffled-duplicates — 分层统计 / ms</summary><table><tr><th>阶段</th><th>Min</th><th>Median</th><th>P95</th></tr><tr><td>rust_e2e</td><td>10.5407</td><td>11.4866</td><td>11.6983</td></tr><tr><td>python_e2e</td><td>123.2557</td><td>125.5172</td><td>130.5692</td></tr><tr><td>python_core</td><td>117.3800</td><td>118.4904</td><td>149.4523</td></tr><tr><td>normalize</td><td>4.7355</td><td>5.7077</td><td>6.2642</td></tr><tr><td>python_ipc_encode</td><td>0.8550</td><td>0.8905</td><td>1.1839</td></tr><tr><td>python_ipc_decode</td><td>0.2330</td><td>0.4933</td><td>0.6347</td></tr><tr><td>native_profile_call</td><td>3.9673</td><td>4.1923</td><td>4.8083</td></tr><tr><td>rust_ipc_decode</td><td>0.3170</td><td>0.3386</td><td>0.4479</td></tr><tr><td>rust_core</td><td>3.4636</td><td>3.7982</td><td>4.4116</td></tr><tr><td>rust_ipc_encode</td><td>0.0387</td><td>0.0439</td><td>0.0505</td></tr><tr><td>conversion_total</td><td>1.5397</td><td>1.8430</td><td>2.1967</td></tr></table></details>
<section><h2>环境、构建与复现</h2><pre>{
"created_at": "2026-09-08T10:16:07.507600+00:00",
"seed": 721,
"repeats": 7,
"warmups": 2,
"platform": "macOS-26.6.2-arm64-arm-64bit",
"machine": "arm64",
"python": "3.12.13 (main, Mar 3 2026, 15:35:03) [Clang 21.1.4 ]",
"cpu": "Apple M1",
"packages": {
"numpy": "2.5.3",
"pandas": "3.0.2",
"pyarrow": "25.0.1",
"polars": "1.44.1",
"maturin": "1.15.0"
},
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: aarch64-apple-darwin\nrelease: 1.97.1\nLLVM version: 22.1.6",
"base_revision": "4a977385572f196ab7a42bcb3298f5c10204bd3d",
"source_sha256": {
"src/core/position_risk.rs": "e4e5cb8207c57a20be5cf3220ad6f6edb23c69119597ee84d2f6f0553e11b703",
"src/python.rs": "94c788e32ff4c798d446615cbfe9c8cca7453c5101c928c062091ac9bd7d8cd8",
"python/wbt/position_risk.py": "9c99f595ae8d5c08d2fbab3f860afd53f24f318bbddd76cef5b28dc20c702284",
"python/scripts/position_risk_reference.py": "0029701b2ad9c0d821bafcb926a2add534acaae8989f8dd43ed3d113e765c2b8",
"python/scripts/benchmark_position_risk.py": "a9882d0891dfee8f9370b79bab0b307fd46e4508ce61f4dcb96bde56f2804d49"
},
"extension_sha256": "4bb930174a765154e237880ab161bc84e246089b7e6551c6aa7e88a193031ac4",
"cargo_lock_sha256": "0ad0a1f57d4c9cc60fb9bf1dd470f459e111ae3412fd7e42f53f9385740d1603",
"build": "maturin develop --release; opt-level=3, lto=fat, codegen-units=1; debug assertions checked off",
"command": "python/scripts/benchmark_position_risk.py --seed 721 --repeats 7 --warmups 2 --output docs/benchmarks/position_risk"
}</pre><p>运行命令与锁定依赖见 docs/position_risk.md;JSON 保留全部原始样本。</p></section>
<details><summary>内嵌完整 JSON(离线可审计)</summary><pre>{
"metadata": {
"created_at": "2026-09-08T10:16:07.507600+00:00",
"seed": 721,
"repeats": 7,
"warmups": 2,
"platform": "macOS-26.6.2-arm64-arm-64bit",
"machine": "arm64",
"python": "3.12.13 (main, Mar 3 2026, 15:35:03) [Clang 21.1.4 ]",
"cpu": "Apple M1",
"packages": {
"numpy": "2.5.3",
"pandas": "3.0.2",
"pyarrow": "25.0.1",
"polars": "1.44.1",
"maturin": "1.15.0"
},
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: aarch64-apple-darwin\nrelease: 1.97.1\nLLVM version: 22.1.6",
"base_revision": "4a977385572f196ab7a42bcb3298f5c10204bd3d",
"source_sha256": {
"src/core/position_risk.rs": "e4e5cb8207c57a20be5cf3220ad6f6edb23c69119597ee84d2f6f0553e11b703",
"src/python.rs": "94c788e32ff4c798d446615cbfe9c8cca7453c5101c928c062091ac9bd7d8cd8",
"python/wbt/position_risk.py": "9c99f595ae8d5c08d2fbab3f860afd53f24f318bbddd76cef5b28dc20c702284",
"python/scripts/position_risk_reference.py": "0029701b2ad9c0d821bafcb926a2add534acaae8989f8dd43ed3d113e765c2b8",
"python/scripts/benchmark_position_risk.py": "a9882d0891dfee8f9370b79bab0b307fd46e4508ce61f4dcb96bde56f2804d49"
},
"extension_sha256": "4bb930174a765154e237880ab161bc84e246089b7e6551c6aa7e88a193031ac4",
"cargo_lock_sha256": "0ad0a1f57d4c9cc60fb9bf1dd470f459e111ae3412fd7e42f53f9385740d1603",
"build": "maturin develop --release; opt-level=3, lto=fat, codegen-units=1; debug assertions checked off",
"command": "python/scripts/benchmark_position_risk.py --seed 721 --repeats 7 --warmups 2 --output docs/benchmarks/position_risk"
},
"cases": [
{
"name": "tiny",
"rows": 12,
"times": 4,
"symbols": 3,
"input_sha256": "453ddb7d0586e192cf9e8bb29bee6b395d2d0608cc41248c0dd9ca2cc2dd13d5",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 1.0265409982821438,
"min_ms": 0.8232079999288544,
"p95_ms": 1.3023044983128784,
"samples_seconds": [
0.0010265409982821438,
0.0010683330001484137,
0.0008666249996167608,
0.001246042000275338,
0.00094600000011269,
0.0013264169974718243,
0.0008232079999288544
]
},
"python_e2e": {
"median_ms": 0.9499579973635264,
"min_ms": 0.7763339999655727,
"p95_ms": 1.7911581006046613,
"samples_seconds": [
0.0013147499994374812,
0.0009393340005772188,
0.0007763339999655727,
0.001995333001104882,
0.0009041250013979152,
0.0011161250004079193,
0.0009499579973635264
]
},
"python_core": {
"median_ms": 0.5072080020909198,
"min_ms": 0.38270799996098503,
"p95_ms": 0.5402284983574646,
"samples_seconds": [
0.0005464159985422157,
0.0005072080020909198,
0.00040920800165622495,
0.0005172920027689543,
0.00044100000013713725,
0.0005257909979263786,
0.00038270799996098503
]
},
"normalize": {
"median_ms": 0.5153329984750599,
"min_ms": 0.43091599945910275,
"p95_ms": 1.2151287999586196,
"samples_seconds": [
0.0014701660002174322,
0.0004934169992338866,
0.0005235000026004855,
0.0005153329984750599,
0.0005137500011187512,
0.00043091599945910275,
0.0006200419993547257
]
},
"python_ipc_encode": {
"median_ms": 0.16070800120360218,
"min_ms": 0.1385000032314565,
"p95_ms": 0.2459829003782943,
"samples_seconds": [
0.0001385000032314565,
0.0001925409997056704,
0.00014400000145542435,
0.00015845900270505808,
0.00016070800120360218,
0.00025608299984014593,
0.0002224160016339738
]
},
"python_ipc_decode": {
"median_ms": 0.22725000235368498,
"min_ms": 0.19258300017099828,
"p95_ms": 1.288000098793417,
"samples_seconds": [
0.0017116249982791487,
0.00022725000235368498,
0.00019258300017099828,
0.00021691599977202713,
0.00022008299856679514,
0.00029954199999338016,
0.0002979580021928996
]
},
"native_profile_call": {
"median_ms": 0.04629199975170195,
"min_ms": 0.03399999695830047,
"p95_ms": 0.07375019922619686,
"samples_seconds": [
4.629199975170195e-05,
3.399999695830047e-05,
4.149999949731864e-05,
3.454200123087503e-05,
5.145899922354147e-05,
7.083399759721942e-05,
7.499999992433004e-05
]
},
"rust_ipc_decode": {
"median_ms": 0.015291999999999998,
"min_ms": 0.009708,
"p95_ms": 0.026549800000000002,
"samples_seconds": [
1.5292e-05,
9.708e-06,
1.3791e-05,
1.0375e-05,
1.8375e-05,
2.4916e-05,
2.725e-05
]
},
"rust_core": {
"median_ms": 0.00775,
"min_ms": 0.0053750000000000004,
"p95_ms": 0.013149899999999999,
"samples_seconds": [
7.709e-06,
5.75e-06,
7.75e-06,
5.375e-06,
9.084e-06,
1.2333e-05,
1.35e-05
]
},
"rust_ipc_encode": {
"median_ms": 0.018458,
"min_ms": 0.01425,
"p95_ms": 0.0276287,
"samples_seconds": [
1.8458e-05,
1.425e-05,
1.6042e-05,
1.4666e-05,
2.0375e-05,
2.6375e-05,
2.8166e-05
]
},
"conversion_total": {
"median_ms": 0.44374900205935536,
"min_ms": 0.3664160016264226,
"p95_ms": 1.5007873010074806,
"samples_seconds": [
0.0018838750015106051,
0.00044374900205935535,
0.0003664160016264226,
0.0004004160024770852,
0.0004195409997703973,
0.0006069159998335261,
0.0005757900038268733
]
}
},
"e2e_speedup": 0.925397036215042,
"core_speedup": 65.44619381818319
},
{
"name": "small-dense",
"rows": 1000,
"times": 100,
"symbols": 10,
"input_sha256": "92559bbdbb896712cc1a57bc8b1add5ee746d81dffe8004954803e3a60cc8408",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 1.9156249982188456,
"min_ms": 1.5762910006742459,
"p95_ms": 2.250470698345452,
"samples_seconds": [
0.0017358750010316726,
0.0019156249982188456,
0.002025041998422239,
0.002347082998312544,
0.0017714169989631046,
0.0015762910006742459,
0.0020138750005571637
]
},
"python_e2e": {
"median_ms": 2.9621670000778977,
"min_ms": 2.6614159978635143,
"p95_ms": 3.2571079984336393,
"samples_seconds": [
0.0029621670000778977,
0.0032700829979148693,
0.0030149169979267754,
0.0032268329996441025,
0.002886624999518972,
0.002663333001692081,
0.0026614159978635143
]
},
"python_core": {
"median_ms": 1.764458000252489,
"min_ms": 1.6908750003494788,
"p95_ms": 2.0544419003272196,
"samples_seconds": [
0.0019040000006498303,
0.002118917000188958,
0.001713208999717608,
0.001764458000252489,
0.0017899579979712144,
0.0017452499996579718,
0.0016908750003494788
]
},
"normalize": {
"median_ms": 1.0487910003575962,
"min_ms": 0.9589999972376972,
"p95_ms": 1.2857036999776028,
"samples_seconds": [
0.0010779999975056853,
0.0009589999972376972,
0.0010487910003575962,
0.0012592500024766196,
0.0012970409989065956,
0.0010092080010508653,
0.0009827499998209532
]
},
"python_ipc_encode": {
"median_ms": 0.4522500021266751,
"min_ms": 0.29591699785669334,
"p95_ms": 0.537608700687997,
"samples_seconds": [
0.0005134580023877788,
0.00029591699785669334,
0.00034720899930107407,
0.0004522500021266751,
0.00045679200047743507,
0.0003233339994039852,
0.0005479589999595191
]
},
"python_ipc_decode": {
"median_ms": 0.23024999973131344,
"min_ms": 0.16975000107777305,
"p95_ms": 0.3918961992894765,
"samples_seconds": [
0.0003669580000860151,
0.00017629099966143258,
0.0004025839989481028,
0.000258708001638297,
0.00023024999973131344,
0.00016975000107777305,
0.0002175839981646277
]
},
"native_profile_call": {
"median_ms": 0.12375000005704351,
"min_ms": 0.0832920013635885,
"p95_ms": 0.15222889960568864,
"samples_seconds": [
0.0001237500000570435,
8.32920013635885e-05,
9.029200009535998e-05,
0.0001485840002715122,
8.59159990795888e-05,
0.00013899999976274557,
0.00015379099932033569
]
},
"rust_ipc_decode": {
"median_ms": 0.030083,
"min_ms": 0.015667,
"p95_ms": 0.0447419,
"samples_seconds": [
3.0083e-05,
1.6208e-05,
1.6875e-05,
4.2e-05,
1.5667e-05,
3.6834e-05,
4.5917e-05
]
},
"rust_core": {
"median_ms": 0.060625000000000005,
"min_ms": 0.047875,
"p95_ms": 0.0687875,
"samples_seconds": [
6.0625e-05,
4.7875e-05,
5.4209e-05,
6.7625e-05,
5.5e-05,
6.9125e-05,
6.8e-05
]
},
"rust_ipc_encode": {
"median_ms": 0.024083,
"min_ms": 0.011208000000000001,
"p95_ms": 0.031849999999999996,
"samples_seconds": [
2.4083e-05,
1.4958e-05,
1.4709e-05,
2.8875e-05,
1.1208e-05,
2.6083e-05,
3.3125e-05
]
},
"conversion_total": {
"median_ms": 0.7813769982491768,
"min_ms": 0.503373997518126,
"p95_ms": 0.9075829011688998,
"samples_seconds": [
0.000934582002473794,
0.0005033739975181259,
0.0007813769982491769,
0.0007818330037649721,
0.0007139170002087485,
0.0005560010004817583,
0.0008445849981241468
]
}
},
"e2e_speedup": 1.54631882692705,
"core_speedup": 29.104461859834867
},
{
"name": "dense-100k",
"rows": 100000,
"times": 1000,
"symbols": 100,
"input_sha256": "b92a47263827f79f31c7d6538323fa68f4925f3df251b52f04645ef0f23c8ecd",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 17.040250000718515,
"min_ms": 16.241249999438878,
"p95_ms": 17.91919129755115,
"samples_seconds": [
0.017686791998130502,
0.016241249999438878,
0.017040250000718515,
0.016316791999997804,
0.01718208300007973,
0.018018790997302858,
0.01670975000160979
]
},
"python_e2e": {
"median_ms": 209.1555420010991,
"min_ms": 205.8595000016794,
"p95_ms": 214.3436873993778,
"samples_seconds": [
0.2091555420010991,
0.20664291600041906,
0.20924229199954425,
0.2058595000016794,
0.21338920800189953,
0.20746312499977648,
0.21475274999829708
]
},
"python_core": {
"median_ms": 199.3359580010292,
"min_ms": 197.93441699948744,
"p95_ms": 207.23882070051332,
"samples_seconds": [
0.20610216700151796,
0.20772595800008276,
0.1979922919999808,
0.1983958340024401,
0.2000791249993199,
0.19793441699948744,
0.1993359580010292
]
},
"normalize": {
"median_ms": 7.781541997246677,
"min_ms": 7.449459000781644,
"p95_ms": 8.44830019850633,
"samples_seconds": [
0.007770750002237037,
0.007781541997246677,
0.008086833000561455,
0.007721875001152512,
0.008208958999603055,
0.008550874998036306,
0.007449459000781644
]
},
"python_ipc_encode": {
"median_ms": 1.2309170015214477,
"min_ms": 0.9434589992451947,
"p95_ms": 1.3654668007802684,
"samples_seconds": [
0.0013069579981674906,
0.0012309170015214477,
0.0009434589992451947,
0.0011531250020198058,
0.0012348750024102628,
0.0013905420019000303,
0.0009669589999248274
]
},
"python_ipc_decode": {
"median_ms": 0.5528330002562143,
"min_ms": 0.47020900092320517,
"p95_ms": 0.7523248987126862,
"samples_seconds": [
0.0004980000012437813,
0.0005528330002562143,
0.000641957998595899,
0.0004796250032086391,
0.0006028749994584359,
0.000799624998762738,
0.00047020900092320517
]
},
"native_profile_call": {
"median_ms": 7.290458997886162,
"min_ms": 7.048291001410689,
"p95_ms": 7.46630819994607,
"samples_seconds": [
0.007445541999913985,
0.007283458999154391,
0.007048291001410689,
0.00741458299671649,
0.007475207999959821,
0.0070940000005066395,
0.007290458997886162
]
},
"rust_ipc_decode": {
"median_ms": 0.71825,
"min_ms": 0.660083,
"p95_ms": 0.8888124999999999,
"samples_seconds": [
0.0006875,
0.00071825,
0.000749416,
0.000660083,
0.000757125,
0.000667709,
0.00094525
]
},
"rust_core": {
"median_ms": 6.5075,
"min_ms": 6.2471250000000005,
"p95_ms": 6.6970543000000005,
"samples_seconds": [
0.006692708,
0.0065075,
0.006247125,
0.006698917,
0.006661958,
0.006348916,
0.006275708
]
},
"rust_ipc_encode": {
"median_ms": 0.041083,
"min_ms": 0.035958,
"p95_ms": 0.05508729999999999,
"samples_seconds": [
4.6541e-05,
4.1375e-05,
3.5958e-05,
3.9625e-05,
4.1083e-05,
5.875e-05,
4.0333e-05
]
},
"conversion_total": {
"median_ms": 2.538998999411272,
"min_ms": 2.3324580052284447,
"p95_ms": 2.832425601024547,
"samples_seconds": [
0.002538998999411272,
0.002543375001777662,
0.002370790997841094,
0.0023324580052284448,
0.0026359580018686986,
0.0029166260006627683,
0.0024227510008480325
]
}
},
"e2e_speedup": 12.27420618783644,
"core_speedup": 30.631726162278788
},
{
"name": "dense-500k",
"rows": 500000,
"times": 2000,
"symbols": 250,
"input_sha256": "d7a01b79ea334543a16c208971864854ccf7214e7470e6a13ccceda48b9d064c",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 68.58045800254331,
"min_ms": 63.77287499708473,
"p95_ms": 70.72082119884726,
"samples_seconds": [
0.06560012499903678,
0.06377287499708473,
0.06796170799862011,
0.06859554200127604,
0.06947683299949858,
0.06858045800254331,
0.07125395899856812
]
},
"python_e2e": {
"median_ms": 1199.7927080010413,
"min_ms": 1162.1900829995866,
"p95_ms": 1213.5771126027976,
"samples_seconds": [
1.1621900829995866,
1.1880060830008006,
1.1909050829999615,
1.1997927080010413,
1.2017713750028634,
1.213201417001983,
1.2137381250031467
]
},
"python_core": {
"median_ms": 1176.0042079986306,
"min_ms": 1153.8701659992512,
"p95_ms": 1273.2020586001454,
"samples_seconds": [
1.1538701659992512,
1.307592459001171,
1.1706380420000642,
1.1760042079986306,
1.1737338750026538,
1.1929577909977525,
1.1867569579990231
]
},
"normalize": {
"median_ms": 24.34541600086959,
"min_ms": 23.243958999955794,
"p95_ms": 26.03684199893905,
"samples_seconds": [
0.023243958999955794,
0.02434541600086959,
0.02390137499969569,
0.02434854100283701,
0.02440566699806368,
0.026735916999314213,
0.024201292002544506
]
},
"python_ipc_encode": {
"median_ms": 4.561249999824213,
"min_ms": 4.4698329984385055,
"p95_ms": 5.075478800790734,
"samples_seconds": [
0.004561249999824213,
0.004724166999949375,
0.005226041001151316,
0.0044702909981424455,
0.0044778330011467915,
0.0044698329984385055,
0.004612500000803266
]
},
"python_ipc_decode": {
"median_ms": 0.5197919999773148,
"min_ms": 0.3424580027058255,
"p95_ms": 0.7876669995312112,
"samples_seconds": [
0.00046137500248732977,
0.0005197919999773148,
0.0005805840009998064,
0.0006187919971125666,
0.0005194580007810146,
0.0003424580027058255,
0.0008600420005677734
]
},
"native_profile_call": {
"median_ms": 37.815125000634,
"min_ms": 35.781916998530505,
"p95_ms": 38.92561240099894,
"samples_seconds": [
0.03637391699885484,
0.035781916998530505,
0.03857558299932862,
0.03777766699931817,
0.037815125000634,
0.038224957999773324,
0.0390756250017148
]
},
"rust_ipc_decode": {
"median_ms": 3.699667,
"min_ms": 3.611834,
"p95_ms": 4.2052918,
"samples_seconds": [
0.003623,
0.003634875,
0.003921208,
0.003611834,
0.003699667,
0.003991208,
0.004297042
]
},
"rust_core": {
"median_ms": 34.103083999999996,
"min_ms": 32.081375,
"p95_ms": 34.6760921,
"samples_seconds": [
0.0326665,
0.032081375,
0.034584334,
0.034103084,
0.033993584,
0.034167583,
0.034715417
]
},
"rust_ipc_encode": {
"median_ms": 0.047375,
"min_ms": 0.042457999999999996,
"p95_ms": 0.0603419,
"samples_seconds": [
5.9875e-05,
4.5959e-05,
4.9542e-05,
4.5792e-05,
6.0542e-05,
4.7375e-05,
4.2458e-05
]
},
"conversion_total": {
"median_ms": 8.850874001144332,
"min_ms": 8.705500002311544,
"p95_ms": 9.801641901605063,
"samples_seconds": [
0.008705500002311543,
0.008924792999926691,
0.009777375002151123,
0.008746708995255013,
0.008757500001927807,
0.008850874001144331,
0.009812042001371039
]
}
},
"e2e_speedup": 17.4946733070308,
"core_speedup": 34.48380820921154
},
{
"name": "sparse-1000-symbols",
"rows": 60000,
"times": 20000,
"symbols": 1000,
"input_sha256": "1d91a022076342e0ab39b80b3671331a82224f4228463e33c7304656559bce4d",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 15.148500002396759,
"min_ms": 14.918957996997051,
"p95_ms": 15.412579401163384,
"samples_seconds": [
0.014971874999901047,
0.015054207997309277,
0.015451667000888847,
0.014918957996997051,
0.015321375001803972,
0.015148500002396759,
0.01527462500234833
]
},
"python_e2e": {
"median_ms": 217.4219170010474,
"min_ms": 215.45466699899407,
"p95_ms": 234.98334609976155,
"samples_seconds": [
0.24217458400016767,
0.21565241599819274,
0.21611354199922062,
0.21820379099881393,
0.21545466699899407,
0.21782470800098963,
0.2174219170010474
]
},
"python_core": {
"median_ms": 210.0207080002292,
"min_ms": 207.76358299917774,
"p95_ms": 212.1716542987997,
"samples_seconds": [
0.20776358299917774,
0.21208645799924852,
0.21220816699860734,
0.2090936659988074,
0.2100207080002292,
0.21156979099760065,
0.2090314170018246
]
},
"normalize": {
"median_ms": 7.308041000214871,
"min_ms": 6.229167000128655,
"p95_ms": 8.032329300112906,
"samples_seconds": [
0.007308041000214871,
0.006229167000128655,
0.0075593750007101335,
0.006979750000027707,
0.008227541999076493,
0.0066600829995877575,
0.0075768330025312025
]
},
"python_ipc_encode": {
"median_ms": 0.9980830000131391,
"min_ms": 0.8118749974528328,
"p95_ms": 1.0464838000189047,
"samples_seconds": [
0.0010311250007362105,
0.0009561250008118805,
0.001051084000209812,
0.0008118749974528328,
0.0010357499995734543,
0.000998083000013139,
0.0008355410027434118
]
},
"python_ipc_decode": {
"median_ms": 0.6511249994218815,
"min_ms": 0.5649579979944974,
"p95_ms": 0.9318829976109553,
"samples_seconds": [
0.0006097910008975305,
0.0005649579979944974,
0.00101258299764595,
0.000616332999925362,
0.0007102919989847578,
0.0007435829975293018,
0.0006511249994218815
]
},
"native_profile_call": {
"median_ms": 6.113375002314569,
"min_ms": 5.299291999108391,
"p95_ms": 6.23626240012527,
"samples_seconds": [
0.006113375002314569,
0.00623687500046799,
0.00623483299932559,
0.005299291999108391,
0.005837792003148934,
0.005848917000548681,
0.006231291998119559
]
},
"rust_ipc_decode": {
"median_ms": 0.43891600000000003,
"min_ms": 0.41525,
"p95_ms": 0.4622455,
"samples_seconds": [
0.000443958,
0.00041525,
0.000438916,
0.000437958,
0.000470083,
0.000442417,
0.000422041
]
},
"rust_core": {
"median_ms": 5.483833,
"min_ms": 4.726833,
"p95_ms": 5.6392587999999995,
"samples_seconds": [
0.005483833,
0.005651959,
0.005599333,
0.004726833,
0.005195292,
0.005251791,
0.005609625
]
},
"rust_ipc_encode": {
"median_ms": 0.11316699999999999,
"min_ms": 0.094583,
"p95_ms": 0.1425999,
"samples_seconds": [
0.000130292,
0.000113167,
0.000133208,
9.4583e-05,
0.000111958,
0.000104083,
0.000146625
]
},
"conversion_total": {
"median_ms": 2.215166001633741,
"min_ms": 1.9607489973781949,
"p95_ms": 2.543478598066497,
"samples_seconds": [
0.002215166001633741,
0.0020494999988063776,
0.0026357909978557623,
0.001960748997378195,
0.0023280829985582122,
0.002288165997542441,
0.002055332002165293
]
}
},
"e2e_speedup": 14.352702707637551,
"core_speedup": 38.29815897023655
},
{
"name": "shuffled-duplicates",
"rows": 44000,
"times": 2000,
"symbols": 100,
"input_sha256": "ae112574398e82c231be0a28d78fe5107877104321605ec991feceb47b9b06fa",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 11.486625000543427,
"min_ms": 10.540666997258086,
"p95_ms": 11.698274999071145,
"samples_seconds": [
0.011486625000543427,
0.010540666997258086,
0.011657499999273568,
0.010611333000269951,
0.011654874997475417,
0.011189917000592686,
0.011715749998984393
]
},
"python_e2e": {
"median_ms": 125.51724999866565,
"min_ms": 123.25570800021524,
"p95_ms": 130.56915020060842,
"samples_seconds": [
0.13230800000019372,
0.12620462499762652,
0.1251406669980497,
0.12651183400157606,
0.12334308400022564,
0.12551724999866565,
0.12325570800021524
]
},
"python_core": {
"median_ms": 118.49037499996484,
"min_ms": 117.37995799921919,
"p95_ms": 149.45228750038947,
"samples_seconds": [
0.11821224999948754,
0.11782408400176791,
0.16107462500076508,
0.12233349999951315,
0.11849037499996484,
0.12070308300098986,
0.11737995799921919
]
},
"normalize": {
"median_ms": 5.70766700184322,
"min_ms": 4.735542002890725,
"p95_ms": 6.264158201156533,
"samples_seconds": [
0.005232792002061615,
0.006308083000476472,
0.005972249997284962,
0.006161667002743343,
0.00570766700184322,
0.005512209001608426,
0.004735542002890725
]
},
"python_ipc_encode": {
"median_ms": 0.8904579990485217,
"min_ms": 0.8550419988750946,
"p95_ms": 1.1839499024063111,
"samples_seconds": [
0.0008904579990485217,
0.001286000002437504,
0.0009372499989694916,
0.0009458330023335293,
0.0008879580018401612,
0.0008799159986665472,
0.0008550419988750946
]
},
"python_ipc_decode": {
"median_ms": 0.49325000145472586,
"min_ms": 0.23300000248127617,
"p95_ms": 0.6347081012791023,
"samples_seconds": [
0.0006379580008797348,
0.0005181669985176995,
0.0004932500014547259,
0.00023300000248127617,
0.0004899160012428183,
0.0004892500001005828,
0.0006271250022109598
]
},
"native_profile_call": {
"median_ms": 4.192291999061126,
"min_ms": 3.967334003391443,
"p95_ms": 4.808274898459786,
"samples_seconds": [
0.004194791999907466,
0.003997916999651352,
0.003995291997853201,
0.004192291999061126,
0.004917374997603474,
0.004553708000457846,
0.003967334003391443
]
},
"rust_ipc_decode": {
"median_ms": 0.338625,
"min_ms": 0.317,
"p95_ms": 0.44791269999999994,
"samples_seconds": [
0.000338625,
0.000477625,
0.000373167,
0.000317,
0.00032625,
0.00032925,
0.000378584
]
},
"rust_core": {
"median_ms": 3.79825,
"min_ms": 3.463584,
"p95_ms": 4.4116045999999995,
"samples_seconds": [
0.00379825,
0.003463584,
0.003566709,
0.00381,
0.004523417,
0.004150709,
0.003522666
]
},
"rust_ipc_encode": {
"median_ms": 0.043875000000000004,
"min_ms": 0.038708,
"p95_ms": 0.050454599999999995,
"samples_seconds": [
4.0875e-05,
3.8708e-05,
3.9292e-05,
4.3875e-05,
4.8209e-05,
5.1417e-05,
4.5958e-05
]
},
"conversion_total": {
"median_ms": 1.8429590004242173,
"min_ms": 1.5397080048148055,
"p95_ms": 2.196724800647119,
"samples_seconds": [
0.0019079159999282566,
0.0023205000009552034,
0.0018429590004242174,
0.0015397080048148055,
0.0017523330030829794,
0.00174983299876713,
0.0019067090010860543
]
}
},
"e2e_speedup": 10.927252347206206,
"core_speedup": 31.196044230886553
}
]
}</pre></details>
</main></body></html>