Benchmark · Angelo 1.0 release candidate 6 · Claude Opus 5.5
Every result, both sides.
The runs behind the speed numbers: what Angelo and Blender MCP each made from the same one-message briefs, every check they had to pass, failures included, and the reports themselves to download.
Claude Opus 5.5, effort low, on both sides; Claude Code 2.1.293; medians of 5 trials a side, the two sides taking turns on a quiet machine. Every cost is Claude Code's own estimate at list prices, not a bill.
Set
Time
Model calls
Graded correct
Estimated cost
Five everyday tasksmedian of whole trials
Angelo 14.4 sMCP 34.6 s2.4× faster
Angelo 5MCP 12
Angelo 25/25MCP 25/25
Angelo $0.088MCP $0.173
A 40-task sessionmedian of whole trials
Angelo 98.2 sMCP 187.9 s1.9× faster
Angelo 40MCP 82
Angelo 200/200MCP 200/200
Angelo $0.706MCP $1.228
Stone footbridgeone-message scene
Angelo 11 sMCP 18.9 s1.7× faster
Angelo 1MCP 5
Angelo 5/5MCP 5/5
Angelo $0.042MCP $0.146
Arched footbridgeone-message scene
Angelo 19.3 sMCP 17.6 s1.1× slower
Angelo 1MCP 3
Angelo 5/5MCP 5/5
Angelo $0.0573MCP $0.1314
Bevel, subdivide, copperone-message scene
Angelo 3.9 sMCP 18.1 s4.6× faster
Angelo 1MCP 4
Angelo 5/5MCP 5/5
Angelo $0.0262MCP $0.1355
New scene cameraone-message scene
Angelo 4 sMCP 13.4 s3.4× faster
Angelo 1MCP 4
Angelo 5/5MCP 5/5
Angelo $0.0246MCP $0.1199
Three-point lightingone-message scene
Angelo 8.7 sMCP 18.8 s2.2× faster
Angelo 1MCP 4
Angelo 5/5MCP 1/5
Angelo $0.0353MCP $0.1343
02
Every read we timed against stock Blender.
Preliminary Angelo reads a mesh's vertex-group weights about 180× faster than stock Blender's fastest route. Angelo reads your scene with native code added to Blender. Each row is a read Angelo makes on every edit, timed against the fastest route stock Blender 5.2.2 LTS offers for the same data, on the same scene and machine. Medians of 7 runs, range in brackets. Where stock Blender is as fast or faster, the row says so. The list grows with each release.
Shared clock3.94ms
PreliminarySlowed down 1,000×
Stock Blender386 msper million vertices, median [383–390]bmesh deform layer: vertex[layer].items() (packed records)
0.56%10,193 of 1,831,116 vertices read
Angelo2.15 msper million vertices, median [2.11–2.41]Mesh.angelo_vertex_group_weights (bytes of records)
Done
100%1,831,116 of 1,831,116 vertices read
Angelo has read the vertex-group weights of every vertex of the castle. Stock Blender's fastest Python route has read 0.56% of them.
Each dot is a vertex of the castle, lit when its vertex is read, in the order both sides read them, at the rates measured per million vertices on the whole scene. The 65 merlons that share one mesh light with its first copy, when that mesh is read. Slowed down 1,000× so you can see it. Both sides run on the same clock, on the same Apple M4 Pro, 14 cores, macOS 26.3. Once Angelo finishes, the frame holds; then the other side plays on fast-forwarded ×60, as its label says.
What is read
Stock Blender's fastest route
Stock Blender
Angelo
Angelo is
Since
Vertex positions
Mesh.attributes['position'].data.foreach_get('vector', preallocated float32 array)2 other stock routes
MeshVertices.foreach_get('co', float32 array) 16 ms
ctypes.memmove from Mesh.attributes['position'].data[0].as_pointer() (unsupported) 1.16 ms
0.77 msper million vertices [0.72–0.86]
0.93 msper million vertices [0.89–1.09]
1.2× slower
1.0
Vertex-group weightsStock Python has no bulk vertex-group read.
bmesh deform layer: vertex[layer].items() (packed records)1 other stock route
for vertex in mesh.vertices: for group in vertex.groups (packed records) 703 ms
386 msper million vertices [383–390]
2.15 msper million vertices [2.11–2.41]
180× faster
1.0
Face corners and offsetsReads every face corner.
Mesh.attributes['.corner_vert'].data.foreach_get('value') + MeshPolygons.foreach_get('loop_start')1 other stock route
MeshLoops.foreach_get('vertex_index') + MeshPolygons.foreach_get('loop_total') 166 ms
1,000 image size and format readsA loaded image; the stock getters would also load an unloaded one.
Image.size, .channels, .depth, .is_float
0.40 msper check [0.39–0.41]
0.56 msper check [0.55–0.57]
1.4× slower
1.0
1,000 registered-property readsA property registered with bpy.props (its value is kept in the ID's system properties).
ID.name (a bpy.props property)
0.057 msper check [0.055–0.13]
0.28 msper check [0.27–0.29]
4.8× slower
1.0
List another .blend's objects (a copy of the scene's file)With the product's own limits the scan refuses this file (see not_timed).Not timed: the same scan with the product's own limits (RuntimeError: metadata_scan: LIMIT_EXCEEDED (blocks read 2000000))
bpy.data.libraries.load(path) as (source, into): source.objects
135 msper check [133–135]
874 msper check [866–889]
6.5× slower
1.0
The mesh being sculptedThe statue in Sculpt Mode; the stock route re-evaluates the object.
Object.evaluated_get(depsgraph).to_mesh()
0.041 msper check [0.036–0.14]
0.048 msper check [0.034–0.049]
as fast
1.0
1,000 ray hits on the mesh being sculpted
Object.ray_cast(origin, direction, depsgraph=...)
1.99 msper check [1.97–2.31]
28.1 msper check [26.4–42.2]
14× slower
1.0
1,000 vertex positions while sculpting
Mesh.vertices[i].co
1.13 msper check [1.11–1.26]
1.39 msper check [1.34–1.46]
1.2× slower
1.0
Measured on Apple M4 Pro, 14 cores, macOS 26.3, Angelo a7fa84aeaa2. Reproduce it with python3 tests/python/angelo_agent/bench_native_reads.py in the Angelo source.
03
What each side made.
One brief per side from Blender's default scene, with no reference image and no follow-up, then the scene is checked. Five trials a side for each scene. Each picture is a trial's own scene: the final still the harness rendered with the scene's settings, or one of four fixed views. Select a picture for the full size.
Stone footbridge
“Add a stone footbridge at the origin: a deck 4 m long and 1.2 m wide, four square posts and two rails, in a grey stone material.”
The 5 checks, read from the scene after the turn
a footbridge about 4 x 1.2 m at the origin
a deck 4 m long and 1.2 m wide, flat
four square posts
two rails
a grey stone material on all of it
Blender MCPpassed 5 of 5 · median 18.9 s · $0.146 estimated
Trial 1✓ Passed 5/5
24.12 s · $0.2552
Trial 2✓ Passed 5/5
18.39 s · $0.144
Trial 3✓ Passed 5/5
18.92 s · $0.146
Trial 4✓ Passed 5/5
21.93 s · $0.1496
Trial 5✓ Passed 5/5
16.63 s · $0.1336
Angelopassed 5 of 5 · median 11 s · $0.042 estimated
Trial 1✓ Passed 5/5
10.2 s · $0.042
Trial 2✓ Passed 5/5
13.81 s · $0.0429
Trial 3✓ Passed 5/5
12.21 s · $0.044
Trial 4✓ Passed 5/5
10.58 s · $0.0415
Trial 5✓ Passed 5/5
11.02 s · $0.0418
Arched footbridge
“Add a slightly arched stone footbridge at the origin: a deck 4 m long and 1.2 m wide, four square posts and two rails, in a grey stone material.”
The 5 checks, read from the scene after the turn
a footbridge about 4 x 1.2 m at the origin
a deck 4 m long and 1.2 m wide, slightly arched
four square posts
two rails
a grey stone material on all of it
Blender MCPpassed 5 of 5 · median 17.6 s · $0.1314 estimated
Trial 1✓ Passed 5/5
15.74 s · $0.2537
Trial 2✓ Passed 5/5
17.18 s · $0.1314
Trial 3✓ Passed 5/5
17.99 s · $0.1289
Trial 4✓ Passed 5/5
17.91 s · $0.131
Trial 5✓ Passed 5/5
17.6 s · $0.1334
Angelopassed 5 of 5 · median 19.3 s · $0.0573 estimated
Trial 1✓ Passed 5/5
19.33 s · $0.0547
Trial 2✓ Passed 5/5
23.9 s · $0.0605
Trial 3✓ Passed 5/5
18.85 s · $0.0573
Trial 4✓ Passed 5/5
17.92 s · $0.0562
Trial 5✓ Passed 5/5
20.28 s · $0.059
Bevel, subdivide, copper
“Bevel the cube's edges by 2 cm with 3 segments, add a Subdivision modifier at level 2, and give it a brushed-copper material.”
The 5 checks, read from the scene after the turn
the default cube is still there (the factory scene is kept)
the cube is where and as large as it was
edges bevelled 2 cm, 3 segments
a Subdivision modifier at level 2
a brushed-copper material
Blender MCPpassed 5 of 5 · median 18.1 s · $0.1355 estimated
Trial 1✓ Passed 5/5
13.89 s · $0.2524
Trial 2✓ Passed 5/5
18.05 s · $0.1379
Trial 3✓ Passed 5/5
18.53 s · $0.1322
Trial 4✓ Passed 5/5
30.91 s · $0.1338
Trial 5✓ Passed 5/5
15.23 s · $0.1355
Angelopassed 5 of 5 · median 3.9 s · $0.0262 estimated
Trial 1✓ Passed 5/5
4.12 s · $0.0263
Trial 2✓ Passed 5/5
3.9 s · $0.0262
Trial 3✓ Passed 5/5
3.83 s · $0.0263
Trial 4✓ Passed 5/5
3.91 s · $0.0262
Trial 5✓ Passed 5/5
5.49 s · $0.026
New scene camera
“Add a camera at (6, -8, 4) aimed at the cube with a 50 mm lens, make it the scene camera, then delete the old camera.”
The 4 checks, read from the scene after the turn
the default cube is still there (the factory scene is kept)
the cube is where and as large as it was
one camera remains: the old one is gone
the scene camera is at (6, -8, 4), aimed at the cube, 50 mm
Blender MCPpassed 5 of 5 · median 13.4 s · $0.1199 estimated
Trial 1✓ Passed 4/4
13.37 s · $0.2441
Trial 2✓ Passed 4/4
12.7 s · $0.1199
Trial 3✓ Passed 4/4
15.79 s · $0.1199
Trial 4✓ Passed 4/4
14.24 s · $0.1188
Trial 5✓ Passed 4/4
13.44 s · $0.1185
Angelopassed 5 of 5 · median 4 s · $0.0246 estimated
Trial 1✓ Passed 4/4
3.98 s · $0.0246
Trial 2✓ Passed 4/4
3.13 s · $0.0246
Trial 3✓ Passed 4/4
4.92 s · $0.0246
Trial 4✓ Passed 4/4
3.54 s · $0.0247
Trial 5✓ Passed 4/4
5.68 s · $0.022
Three-point lighting
“Light the cube with a key, a fill and a rim area light, set the world to a physical sky with the sun 5 degrees up, and switch to Cycles at 128 samples with denoising.”
The 5 checks, read from the scene after the turn
the default cube is still there (the factory scene is kept)
the cube is where and as large as it was
three area lights on the cube: key, fill and a rim behind it
a physical sky with the sun 5 degrees up
Cycles, 128 samples, denoising
Blender MCPpassed 1 of 5 · median 18.8 s · $0.1343 estimated
Trial 1✕ Failed 4/5
18.72 s · $0.2618
Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)
Trial 2✕ Failed 4/5
18.81 s · $0.1343
Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)
Trial 3✕ Failed 4/5
21.27 s · $0.1341
Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)
Trial 4✓ Passed 5/5
17.83 s · $0.1317
Trial 5✕ Failed 4/5
19.09 s · $0.1347
Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)
Angelopassed 5 of 5 · median 8.7 s · $0.0353 estimated
Trial 1✓ Passed 5/5
8.66 s · $0.0362
Trial 2✓ Passed 5/5
9.59 s · $0.0354
Trial 3✓ Passed 5/5
6.84 s · $0.0333
Trial 4✓ Passed 5/5
7.92 s · $0.0344
Trial 5✓ Passed 5/5
10.42 s · $0.0353
04
The raw results.
The reports these numbers were copied from, as the harness wrote them. Local paths, the account's user name, connection and session IDs and e-mail addresses are replaced by placeholders such as <local path> and <id>; transcripts, logs and the campaign's own configuration are left out.
Every trial with the machine's load, and every pause for a busy machine.
All of it, zipped · 355 KBThe pictures above are in /media/bench/rc6-opus, one per trial and view. The harness that wrote these reports is bench_mcp_vs_angelo.py and final_runs.py in the Angelo repository.