9b30421b34
CI / lint (pull_request) Successful in 16s
CI / typecheck (pull_request) Successful in 27s
CI / security (pull_request) Successful in 21s
CI / quality (pull_request) Successful in 16s
CI / integration_tests (pull_request) Successful in 4m10s
CI / build (pull_request) Successful in 15s
CI / unit_tests (pull_request) Successful in 8m0s
CI / docker (pull_request) Successful in 40s
CI / coverage (pull_request) Successful in 6m22s
CI / lint (push) Successful in 13s
CI / typecheck (push) Successful in 27s
CI / security (push) Successful in 22s
CI / quality (push) Successful in 15s
CI / integration_tests (push) Successful in 4m16s
CI / build (push) Successful in 15s
CI / unit_tests (push) Successful in 8m2s
CI / docker (push) Successful in 39s
CI / coverage (push) Successful in 6m23s
143 lines
5.0 KiB
Python
143 lines
5.0 KiB
Python
"""ASV benchmarks for action table ORM round-trip performance.
|
|
|
|
Measures the performance of:
|
|
- LifecycleActionModel.from_domain() construction from Action domain objects
|
|
- LifecycleActionModel.to_domain() conversion back to domain objects
|
|
- Bulk action model construction for migration-volume workloads
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from cleveragents.domain.models.core.action import (
|
|
Action,
|
|
ActionArgument,
|
|
ArgumentRequirement,
|
|
ArgumentType,
|
|
)
|
|
from cleveragents.domain.models.core.plan import NamespacedName
|
|
from cleveragents.infrastructure.database.models import LifecycleActionModel
|
|
except ModuleNotFoundError:
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
|
from cleveragents.domain.models.core.action import (
|
|
Action,
|
|
ActionArgument,
|
|
ArgumentRequirement,
|
|
ArgumentType,
|
|
)
|
|
from cleveragents.domain.models.core.plan import NamespacedName
|
|
from cleveragents.infrastructure.database.models import LifecycleActionModel
|
|
|
|
|
|
def _make_action(suffix: str = "bench") -> Action:
|
|
"""Create a fully-populated Action for benchmarking."""
|
|
return Action(
|
|
namespaced_name=NamespacedName(
|
|
server=None, namespace="local", name=f"action-{suffix}"
|
|
),
|
|
description="Benchmark action for ORM round-trip testing",
|
|
long_description="A detailed description for measuring serialization cost.",
|
|
definition_of_done="All benchmarks complete in under 1ms",
|
|
strategy_actor="openai/gpt-4",
|
|
execution_actor="openai/gpt-4",
|
|
review_actor="openai/gpt-4",
|
|
apply_actor="openai/gpt-4",
|
|
estimation_actor="openai/gpt-4",
|
|
invariant_actor="openai/gpt-4",
|
|
automation_profile="org/bench-profile",
|
|
reusable=True,
|
|
read_only=False,
|
|
inputs_schema={"type": "object", "properties": {"name": {"type": "string"}}},
|
|
invariants=["No secrets in code", "All tests must pass"],
|
|
tags=["benchmark", "testing", "ci"],
|
|
created_by="bench-user",
|
|
arguments=[
|
|
ActionArgument(
|
|
name="target",
|
|
arg_type=ArgumentType.INTEGER,
|
|
requirement=ArgumentRequirement.REQUIRED,
|
|
description="Target value",
|
|
min_value=0,
|
|
max_value=100,
|
|
),
|
|
ActionArgument(
|
|
name="framework",
|
|
arg_type=ArgumentType.STRING,
|
|
requirement=ArgumentRequirement.OPTIONAL,
|
|
description="Framework name",
|
|
default_value="pytest",
|
|
),
|
|
],
|
|
)
|
|
|
|
|
|
class ActionModelFromDomainSuite:
|
|
"""Benchmark LifecycleActionModel.from_domain() construction."""
|
|
|
|
def setup(self) -> None:
|
|
self.action = _make_action()
|
|
self.minimal_action = Action(
|
|
namespaced_name=NamespacedName(
|
|
server=None, namespace="local", name="minimal"
|
|
),
|
|
description="Minimal action",
|
|
definition_of_done="Done",
|
|
strategy_actor="openai/gpt-4",
|
|
execution_actor="openai/gpt-4",
|
|
)
|
|
|
|
def time_from_domain_full(self) -> None:
|
|
"""Convert a fully-populated Action to ORM model."""
|
|
LifecycleActionModel.from_domain(self.action)
|
|
|
|
def time_from_domain_minimal(self) -> None:
|
|
"""Convert a minimal Action to ORM model."""
|
|
LifecycleActionModel.from_domain(self.minimal_action)
|
|
|
|
|
|
class ActionModelToDomainSuite:
|
|
"""Benchmark LifecycleActionModel.to_domain() conversion."""
|
|
|
|
def setup(self) -> None:
|
|
self.full_model = LifecycleActionModel.from_domain(_make_action())
|
|
self.minimal_model = LifecycleActionModel.from_domain(
|
|
Action(
|
|
namespaced_name=NamespacedName(
|
|
server=None, namespace="local", name="minimal"
|
|
),
|
|
description="Minimal action",
|
|
definition_of_done="Done",
|
|
strategy_actor="openai/gpt-4",
|
|
execution_actor="openai/gpt-4",
|
|
)
|
|
)
|
|
|
|
def time_to_domain_full(self) -> None:
|
|
"""Convert a fully-populated ORM model back to domain."""
|
|
self.full_model.to_domain()
|
|
|
|
def time_to_domain_minimal(self) -> None:
|
|
"""Convert a minimal ORM model back to domain."""
|
|
self.minimal_model.to_domain()
|
|
|
|
|
|
class ActionModelBulkSuite:
|
|
"""Benchmark bulk action model construction for migration volumes."""
|
|
|
|
def setup(self) -> None:
|
|
self.actions = [_make_action(str(i)) for i in range(100)]
|
|
|
|
def time_bulk_from_domain_100(self) -> None:
|
|
"""Convert 100 Action domain objects to ORM models."""
|
|
for action in self.actions:
|
|
LifecycleActionModel.from_domain(action)
|
|
|
|
def time_bulk_round_trip_100(self) -> None:
|
|
"""Full round-trip: domain -> ORM -> domain for 100 actions."""
|
|
for action in self.actions:
|
|
model = LifecycleActionModel.from_domain(action)
|
|
model.to_domain()
|