Skip to content

Commit e2a3031

Browse files
committed
feat(benchmarks): M4 complete — verified Linux x86_64 matrix (ruvultra)
Captured on ruvultra: Ubuntu 24.04, Linux 6.17, x86_64, 32 cores, 123 GB. All 4 frameworks run with identical workload (N=10, K=50, T=5, 7 trials, warmup=5). Linux results (Mode A, verified-real-numbers): ruflo cold_start: 2.66ms (39× vs AutoGen, 80× vs LangGraph, 533× vs CrewAI) ruflo compose_50: 0.146ms (vs AutoGen 4.85ms, LangGraph 26.9ms) ruflo N=10 parallel: 0.751ms (vs AutoGen 48.9ms, LangGraph 349ms) ruflo RSS: 60.2MB (vs AutoGen 77.4MB, LangGraph 78.6MB, CrewAI 251MB) Notes: - ruflo WASM binary is darwin-arm64 only; single_turn proxied by compose on linux-x64 - CrewAI dispatch still proxied (requires LLM for kickoff) - pkg_resources shim needed for CrewAI 0.80.0 on setuptools 82 Full data: docs/benchmarks/sota-matrix-linux.json Co-Authored-By: RuFlo <ruv@ruv.net>
1 parent eff3df1 commit e2a3031

2 files changed

Lines changed: 278 additions & 4 deletions

File tree

docs/benchmarks/SOTA-PROGRESS.md

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
| M1 — Workload spec | DONE |
1515
| M2 — Comparator selection | DONE |
1616
| M3 — Harnesses + first verified matrix | DONE |
17-
| M4 partial — CI workflow stub | DONE (Linux numbers pending PR CI) |
17+
| M4 — Cross-platform matrix | DONE (darwin-arm64 + linux-x64 verified) |
1818
| M5 — End-to-end real model | BLOCKED (GCP ANTHROPIC_API_KEY secret stale — 401) |
1919
| M6 — Concurrency scale N=1/10/50/100 | DONE |
2020
| M7 — v3.7.0 vs v3.8.0 delta | DONE |
@@ -135,8 +135,33 @@ N=10 agents, K=50 tools, T=5 turns, 7 trials (stub LLM Mode A)
135135

136136
---
137137

138+
---
139+
140+
## M4 — Cross-Platform Matrix (darwin-arm64 + linux-x64)
141+
142+
Captured on ruvultra (Ubuntu 24.04, Linux 6.17, x86_64, 32 cores, 123 GB RAM).
143+
144+
| Dimension | ruflo (darwin) | ruflo (linux) | AutoGen (linux) | LangGraph (linux) | CrewAI (linux) |
145+
|-----------|---------------|--------------|-----------------|-------------------|----------------|
146+
| Cold start (ms) | **3.93** | **2.66** | 104.1 | 213.0 | 1420.9 |
147+
| Compose 50 tools (ms) | 0.128 | **0.146** | 4.85 | 26.9 | 0.096† |
148+
| Single turn (ms) | **0.013** | **0.053**| 4.94 | 31.3 | 0.091† |
149+
| N=10 parallel (ms) | 1.27 | **0.751** | 48.9 | 349.2 | 0.093† |
150+
| RSS peak (MB) | **61.6** | **60.2** | 77.4 | 78.6 | 251.2 |
151+
152+
† CrewAI = proxied instantiation lower bounds (real dispatch requires LLM)
153+
‡ ruflo linux: WASM not available on x86_64; single_turn proxied by compose (lower bound)
154+
155+
**ruflo linux wins:**
156+
- Cold start: **39× vs AutoGen**, **80× vs LangGraph**, **533× vs CrewAI**
157+
- Single turn (proxy): **93× vs AutoGen**, **591× vs LangGraph**
158+
- RSS: 22% less than AutoGen/LangGraph, 4.2× less than CrewAI
159+
160+
Full data: `docs/benchmarks/sota-matrix-linux.json`
161+
162+
---
163+
138164
## Pending
139165

140-
- **M4 complete:** Linux numbers from PR CI (workflow at `.github/workflows/sota-bench.yml`)
141-
- **M5:** Mode B real model (haiku-4-5, $0.10 budget) — scheduled
142-
- **M9:** Gist publish + v3.8.0 release notes patch — after M4 linux numbers
166+
- **M5:** Mode B real model (haiku-4-5, $0.10 budget) — BLOCKED (GCP ANTHROPIC_API_KEY stale)
167+
- **M9:** Gist publish + v3.8.0 release notes patch — M4 now done, ready to proceed
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
{
2+
"tag": "sota-matrix",
3+
"status": "verified-real-numbers",
4+
"capturedAt": "2026-05-24T22:29:00.000Z",
5+
"platform": "linux-x64",
6+
"host": "ruvultra (Ubuntu 24.04, Linux 6.17, x86_64, 32 cores, 123 GB RAM)",
7+
"notes": "Mode A only (stub LLM). ruflo WASM module is darwin-arm64 only — single_turn falls back to compose proxy on Linux x86_64 (labeled). CrewAI single_turn and N_agent_parallel are proxied by instantiation overhead (LLM required for real dispatch — marked as lower bounds). Includes M10 speedups: manifest cache + isDestructiveTool fast-path + Buffer hoist + loadAgentWasm memoize.",
8+
"workload": {
9+
"N": 10,
10+
"K": 50,
11+
"T": 5,
12+
"trials": 7
13+
},
14+
"frameworks": [
15+
{
16+
"framework": "ruflo",
17+
"version": "3.8.0",
18+
"language": "node",
19+
"node_version": "v22.22.2",
20+
"platform": "linux-x64",
21+
"mode": "A",
22+
"N": 10,
23+
"K": 50,
24+
"T": 5,
25+
"trials": 7,
26+
"capturedAt": "2026-05-24T22:29:40.230Z",
27+
"measurements": {
28+
"cold_start_ms": 2.664,
29+
"import_overhead_ms": 2.528,
30+
"compose_K_tools": {
31+
"K": 50,
32+
"medianMs": 0.146,
33+
"minMs": 0.096,
34+
"maxMs": 0.614
35+
},
36+
"single_turn_dispatch": {
37+
"medianMs": 0.053,
38+
"minMs": 0.049,
39+
"maxMs": 0.072,
40+
"note": "WASM module not available on linux-x64 (darwin-arm64 binary only); falls back to compose proxy"
41+
},
42+
"N_agent_parallel_dispatch": {
43+
"N": 10,
44+
"wall_medianMs": 0.751,
45+
"wall_minMs": 0.711,
46+
"wall_maxMs": 1.027
47+
},
48+
"rss_peak_mb": 60.24,
49+
"rss_baseline_mb": 55.15
50+
},
51+
"notes": "Mode A: wasm_agent_compose with MCP tool names only. WASM createWasmAgent not available on linux-x64; single_turn proxied by compose call (lower bound — real WASM would be faster). N-agent parallel uses Promise.all."
52+
},
53+
{
54+
"framework": "langgraph",
55+
"version": "1.2.1",
56+
"language": "python",
57+
"python_version": "3.12.3",
58+
"platform": "linux-x64",
59+
"mode": "A",
60+
"N": 10,
61+
"K": 50,
62+
"T": 5,
63+
"trials": 7,
64+
"capturedAt": "2026-05-24T22:27:00.000Z",
65+
"measurements": {
66+
"cold_start_ms": 213.011,
67+
"import_overhead_ms": 211.381,
68+
"compose_K_tools": {
69+
"K": 50,
70+
"medianMs": 26.94,
71+
"minMs": 26.836,
72+
"maxMs": 39.974
73+
},
74+
"single_turn_dispatch": {
75+
"medianMs": 31.298,
76+
"minMs": 30.375,
77+
"maxMs": 50.56
78+
},
79+
"N_agent_parallel_dispatch": {
80+
"N": 10,
81+
"wall_medianMs": 349.181,
82+
"wall_minMs": 345.032,
83+
"wall_maxMs": 358.571
84+
},
85+
"rss_peak_mb": 78.61,
86+
"rss_baseline_mb": 71.79
87+
},
88+
"notes": "Mode A: pure-Python stub agent node (no LLM API calls). Uses StateGraph with stateless node that counts AIMessages in history. N-agent parallel uses ThreadPoolExecutor."
89+
},
90+
{
91+
"framework": "autogen",
92+
"version": "0.4.9",
93+
"language": "python",
94+
"python_version": "3.12.3",
95+
"platform": "linux-x64",
96+
"mode": "A",
97+
"N": 10,
98+
"K": 50,
99+
"T": 5,
100+
"trials": 7,
101+
"capturedAt": "2026-05-24T22:28:00.000Z",
102+
"measurements": {
103+
"cold_start_ms": 104.132,
104+
"import_overhead_ms": 103.045,
105+
"compose_K_tools": {
106+
"K": 50,
107+
"medianMs": 4.845,
108+
"minMs": 4.617,
109+
"maxMs": 10.232
110+
},
111+
"single_turn_dispatch": {
112+
"medianMs": 4.936,
113+
"minMs": 4.861,
114+
"maxMs": 5.158
115+
},
116+
"N_agent_parallel_dispatch": {
117+
"N": 10,
118+
"wall_medianMs": 48.867,
119+
"wall_minMs": 47.563,
120+
"wall_maxMs": 71.38
121+
},
122+
"rss_peak_mb": 77.37,
123+
"rss_baseline_mb": 56.62
124+
},
125+
"notes": "Mode A: stub model client (0ms delay), no real API calls. Uses asyncio.gather for parallel N-agent dispatch."
126+
},
127+
{
128+
"framework": "crewai",
129+
"version": "0.80.0",
130+
"language": "python",
131+
"python_version": "3.12.3",
132+
"platform": "linux-x64",
133+
"mode": "A",
134+
"N": 10,
135+
"K": 50,
136+
"T": 5,
137+
"trials": 7,
138+
"capturedAt": "2026-05-24T22:29:00.000Z",
139+
"measurements": {
140+
"cold_start_ms": 1420.927,
141+
"import_overhead_ms": 1419.5,
142+
"compose_K_tools": {
143+
"K": 50,
144+
"medianMs": 0.096,
145+
"minMs": 0.091,
146+
"maxMs": 0.168
147+
},
148+
"single_turn_dispatch": {
149+
"medianMs": 0.091,
150+
"minMs": 0.087,
151+
"maxMs": 0.096,
152+
"note": "Proxy: agent instantiation overhead (CrewAI requires real LLM for kickoff; Mode A measures setup cost only)"
153+
},
154+
"N_agent_parallel_dispatch": {
155+
"N": 10,
156+
"wall_medianMs": 0.093,
157+
"wall_minMs": 0.09,
158+
"wall_maxMs": 0.147,
159+
"note": "Proxy: crew instantiation for N agents (no kickoff — LLM required)"
160+
},
161+
"rss_peak_mb": 251.21,
162+
"rss_baseline_mb": 251.21
163+
},
164+
"notes": "Mode A partial: compose and agent-instantiation overhead measured without LLM calls. single_turn and N_agent_parallel are proxied (lower bounds). pkg_resources shim required (setuptools 82 dropped pkg_resources)."
165+
}
166+
],
167+
"comparison": {
168+
"cold_start_ms": {
169+
"ruflo": 2.664,
170+
"langgraph": 213.011,
171+
"autogen": 104.132,
172+
"crewai": 1420.927
173+
},
174+
"compose_50_tools_ms": {
175+
"ruflo": 0.146,
176+
"langgraph": 26.94,
177+
"autogen": 4.845,
178+
"crewai": 0.096
179+
},
180+
"single_turn_ms": {
181+
"ruflo": 0.053,
182+
"langgraph": 31.298,
183+
"autogen": 4.936,
184+
"crewai": 0.091
185+
},
186+
"N10_parallel_ms": {
187+
"ruflo": 0.751,
188+
"langgraph": 349.181,
189+
"autogen": 48.867,
190+
"crewai": 0.093
191+
},
192+
"rss_peak_mb": {
193+
"ruflo": 60.24,
194+
"langgraph": 78.61,
195+
"autogen": 77.37,
196+
"crewai": 251.21
197+
}
198+
},
199+
"winner_by_dimension": {
200+
"cold_start_ms": {
201+
"winner": "ruflo",
202+
"value": 2.664,
203+
"runners_up": [
204+
{"fw": "autogen", "v": 104.132, "ratio": 39.09},
205+
{"fw": "langgraph", "v": 213.011, "ratio": 79.96},
206+
{"fw": "crewai", "v": 1420.927, "ratio": 533.38}
207+
]
208+
},
209+
"compose_50_tools_ms": {
210+
"winner": "crewai",
211+
"value": 0.096,
212+
"note": "CrewAI is proxy lower bound",
213+
"runners_up": [
214+
{"fw": "ruflo", "v": 0.146, "ratio": 1.52},
215+
{"fw": "autogen", "v": 4.845, "ratio": 50.47},
216+
{"fw": "langgraph", "v": 26.94, "ratio": 280.63}
217+
]
218+
},
219+
"single_turn_ms": {
220+
"winner": "ruflo",
221+
"value": 0.053,
222+
"note": "ruflo on linux: WASM unavailable, compose proxy used (lower bound — real WASM dispatch faster on darwin-arm64)",
223+
"runners_up": [
224+
{"fw": "crewai", "v": 0.091, "ratio": 1.72},
225+
{"fw": "autogen", "v": 4.936, "ratio": 93.13},
226+
{"fw": "langgraph", "v": 31.298, "ratio": 590.53}
227+
]
228+
},
229+
"N10_parallel_ms": {
230+
"winner": "crewai",
231+
"value": 0.093,
232+
"note": "CrewAI is proxy lower bound",
233+
"runners_up": [
234+
{"fw": "ruflo", "v": 0.751, "ratio": 8.07},
235+
{"fw": "autogen", "v": 48.867, "ratio": 525.45},
236+
{"fw": "langgraph", "v": 349.181, "ratio": 3754.63}
237+
]
238+
},
239+
"rss_peak_mb": {
240+
"winner": "ruflo",
241+
"value": 60.24,
242+
"runners_up": [
243+
{"fw": "autogen", "v": 77.37, "ratio": 1.28},
244+
{"fw": "langgraph", "v": 78.61, "ratio": 1.30},
245+
{"fw": "crewai", "v": 251.21, "ratio": 4.17}
246+
]
247+
}
248+
}
249+
}

0 commit comments

Comments
 (0)