Skip to content

Commit ce00cb8

Browse files
committed
perf: add v1.4.0.dev1 benchmark report for 940xa
Run full benchmark suite (pytest-benchmark + Criterion) on Intel Xeon Gold 5220 (144 cores). Results: - Validation: 8.6x average Rust speedup - Compilation: 1.3x average via serde bridge - 42 native Rust criterion benchmarks included Also fix 4 broken validation benchmarks that passed PyO3 objects instead of dicts to depythonize, and make run_benchmarks.py continue report generation when some benchmarks fail (warns instead of aborting).
1 parent 5689e57 commit ce00cb8

4 files changed

Lines changed: 1682 additions & 83 deletions

File tree

benchmarks/run_benchmarks.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,14 @@ def run_benchmarks(
8585
print(result.stderr, file=sys.stderr)
8686

8787
if result.returncode != 0:
88-
print(f"Benchmark run failed with exit code {result.returncode}", file=sys.stderr)
89-
sys.exit(1)
88+
print(
89+
f"Warning: pytest exited with code {result.returncode} "
90+
f"(some benchmarks may have failed)",
91+
file=sys.stderr,
92+
)
93+
if not out_path.exists():
94+
print("No benchmark JSON produced — aborting.", file=sys.stderr)
95+
sys.exit(1)
9096

9197
with open(out_path) as f:
9298
return json.load(f)

benchmarks/test_validation_bench.py

Lines changed: 124 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,27 @@ def test_validate_role_context_rust(benchmark, rust_validator):
316316
reason="",
317317
)
318318
def test_validate_pattern_simple_rust(benchmark, rust_validator):
319-
"""Validate a simple entity pattern via Rust PyO3 extraction + validation."""
320-
from type_bridge_core import EntityPattern, HasConstraint, LiteralValue
321-
322-
pattern = EntityPattern(
323-
variable="$p",
324-
type_name="person",
325-
constraints=[
326-
HasConstraint(attr_name="name", value=LiteralValue(value="Alice", value_type="string"))
327-
],
328-
)
319+
"""Validate a simple entity pattern via Rust depythonize."""
320+
pattern = {
321+
"type": "Entity",
322+
"data": {
323+
"variable": "$p",
324+
"type_name": "person",
325+
"constraints": [
326+
{
327+
"type": "Has",
328+
"data": {
329+
"attr_name": "name",
330+
"value": {
331+
"type": "Literal",
332+
"data": {"value": "Alice", "value_type": "string"},
333+
},
334+
},
335+
}
336+
],
337+
"is_strict": False,
338+
},
339+
}
329340
benchmark(rust_validator.validate_pattern, pattern)
330341

331342

@@ -335,54 +346,71 @@ def test_validate_pattern_simple_rust(benchmark, rust_validator):
335346
)
336347
def test_validate_pattern_complex_rust(benchmark, rust_validator):
337348
"""Validate a complex nested pattern (Or + Relation + Not) via Rust."""
338-
from type_bridge_core import (
339-
EntityPattern,
340-
HasConstraint,
341-
LiteralValue,
342-
NotPattern,
343-
OrPattern,
344-
RelationPattern,
345-
RolePlayer,
346-
)
347-
348-
pattern = OrPattern(
349-
alternatives=[
349+
pattern = {
350+
"type": "Or",
351+
"data": [
350352
[
351-
EntityPattern(
352-
variable="$p",
353-
type_name="person",
354-
constraints=[
355-
HasConstraint(
356-
attr_name="name", value=LiteralValue(value="Alice", value_type="string")
357-
),
358-
HasConstraint(
359-
attr_name="age", value=LiteralValue(value=30, value_type="long")
360-
),
361-
],
362-
),
363-
RelationPattern(
364-
variable="$r",
365-
type_name="employment",
366-
role_players=[
367-
RolePlayer(role="employee", player_var="$p"),
368-
RolePlayer(role="employer", player_var="$c"),
369-
],
370-
),
353+
{
354+
"type": "Entity",
355+
"data": {
356+
"variable": "$p",
357+
"type_name": "person",
358+
"constraints": [
359+
{
360+
"type": "Has",
361+
"data": {
362+
"attr_name": "name",
363+
"value": {
364+
"type": "Literal",
365+
"data": {"value": "Alice", "value_type": "string"},
366+
},
367+
},
368+
},
369+
{
370+
"type": "Has",
371+
"data": {
372+
"attr_name": "age",
373+
"value": {
374+
"type": "Literal",
375+
"data": {"value": 30, "value_type": "long"},
376+
},
377+
},
378+
},
379+
],
380+
"is_strict": False,
381+
},
382+
},
383+
{
384+
"type": "Relation",
385+
"data": {
386+
"variable": "$r",
387+
"type_name": "employment",
388+
"role_players": [
389+
{"role": "employee", "player_var": "$p"},
390+
{"role": "employer", "player_var": "$c"},
391+
],
392+
"constraints": [],
393+
},
394+
},
371395
],
372396
[
373-
NotPattern(
374-
patterns=[
375-
EntityPattern(
376-
variable="$p",
377-
type_name="retired-person",
378-
constraints=[],
379-
is_strict=True,
380-
),
381-
]
382-
),
397+
{
398+
"type": "Not",
399+
"data": [
400+
{
401+
"type": "Entity",
402+
"data": {
403+
"variable": "$p",
404+
"type_name": "retired-person",
405+
"constraints": [],
406+
"is_strict": True,
407+
},
408+
}
409+
],
410+
}
383411
],
384-
]
385-
)
412+
],
413+
}
386414
benchmark(rust_validator.validate_pattern, pattern)
387415

388416

@@ -396,10 +424,11 @@ def test_validate_pattern_complex_rust(benchmark, rust_validator):
396424
reason="",
397425
)
398426
def test_validate_statement_simple_rust(benchmark, rust_validator):
399-
"""Validate a simple IsaStatement via Rust."""
400-
from type_bridge_core import IsaStatement
401-
402-
stmt = IsaStatement(variable="$p", type_name="person")
427+
"""Validate a simple Isa statement via Rust depythonize."""
428+
stmt = {
429+
"type": "Isa",
430+
"data": {"variable": "$p", "type_name": "person"},
431+
}
403432
benchmark(rust_validator.validate_statement, stmt)
404433

405434

@@ -408,27 +437,41 @@ def test_validate_statement_simple_rust(benchmark, rust_validator):
408437
reason="",
409438
)
410439
def test_validate_statement_relation_rust(benchmark, rust_validator):
411-
"""Validate a RelationStatement with role players and attributes via Rust."""
412-
from type_bridge_core import HasStatement, LiteralValue, RelationStatement, RolePlayer
413-
414-
stmt = RelationStatement(
415-
variable="$rel",
416-
type_name="employment",
417-
role_players=[
418-
RolePlayer(role="employee", player_var="$p"),
419-
RolePlayer(role="employer", player_var="$c"),
420-
],
421-
attributes=[
422-
HasStatement(
423-
subject_var="$rel",
424-
attr_name="start-date",
425-
value=LiteralValue(value="2024-01-15", value_type="date"),
426-
),
427-
HasStatement(
428-
subject_var="$rel",
429-
attr_name="salary",
430-
value=LiteralValue(value=95000, value_type="long"),
431-
),
432-
],
433-
)
440+
"""Validate a Relation statement with role players and attributes via Rust."""
441+
stmt = {
442+
"type": "Relation",
443+
"data": {
444+
"variable": "$rel",
445+
"type_name": "employment",
446+
"role_players": [
447+
{"role": "employee", "player_var": "$p"},
448+
{"role": "employer", "player_var": "$c"},
449+
],
450+
"include_variable": True,
451+
"attributes": [
452+
{
453+
"type": "Has",
454+
"data": {
455+
"subject_var": "$rel",
456+
"attr_name": "start-date",
457+
"value": {
458+
"type": "Literal",
459+
"data": {"value": "2024-01-15", "value_type": "date"},
460+
},
461+
},
462+
},
463+
{
464+
"type": "Has",
465+
"data": {
466+
"subject_var": "$rel",
467+
"attr_name": "salary",
468+
"value": {
469+
"type": "Literal",
470+
"data": {"value": 95000, "value_type": "long"},
471+
},
472+
},
473+
},
474+
],
475+
},
476+
}
434477
benchmark(rust_validator.validate_statement, stmt)

0 commit comments

Comments
 (0)