832fe369fe
- remove unused imports (UTC, datetime, ResourceKind, SandboxStrategy) - remove dead code (_bench_ulid, _CB32, _BENCH_CTR) - use StaticPool for in-memory SQLite consistency
189 lines
6.3 KiB
Python
189 lines
6.3 KiB
Python
"""ASV benchmarks for resource registry lookup operations.
|
|
|
|
Measures the performance of:
|
|
- ResourceTypeSpec construction from config dict
|
|
- ResourceRegistryService.show_type() lookup
|
|
- ResourceRegistryService.show_resource() lookup by name and ULID
|
|
- ResourceRegistryService.list_types() enumeration
|
|
- ResourceRegistryService.list_resources() enumeration
|
|
- ResourceRegistryService.register_resource() creation
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
try:
|
|
from cleveragents.application.services.resource_registry_service import (
|
|
ResourceRegistryService,
|
|
)
|
|
from cleveragents.domain.models.core.resource_type import (
|
|
ResourceTypeSpec,
|
|
)
|
|
except ModuleNotFoundError:
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
|
from cleveragents.application.services.resource_registry_service import (
|
|
ResourceRegistryService,
|
|
)
|
|
from cleveragents.domain.models.core.resource_type import (
|
|
ResourceTypeSpec,
|
|
)
|
|
|
|
|
|
def _setup_db() -> Any:
|
|
"""Create in-memory database and return session factory."""
|
|
from sqlalchemy import create_engine, event
|
|
from sqlalchemy.orm import sessionmaker
|
|
from sqlalchemy.pool import StaticPool
|
|
|
|
from cleveragents.infrastructure.database.models import Base
|
|
|
|
engine = create_engine(
|
|
"sqlite:///:memory:",
|
|
connect_args={"check_same_thread": False},
|
|
poolclass=StaticPool,
|
|
)
|
|
|
|
@event.listens_for(engine, "connect")
|
|
def _fk(conn: Any, _rec: Any) -> None:
|
|
conn.cursor().execute("PRAGMA foreign_keys=ON")
|
|
|
|
Base.metadata.create_all(engine)
|
|
return sessionmaker(bind=engine)
|
|
|
|
|
|
class TypeSpecConstructionSuite:
|
|
"""Benchmark ResourceTypeSpec construction from config dicts."""
|
|
|
|
def time_from_config_minimal(self) -> None:
|
|
"""Benchmark minimal type spec construction."""
|
|
ResourceTypeSpec.from_config(
|
|
{
|
|
"name": "bench/minimal",
|
|
"description": "Minimal benchmark type",
|
|
"resource_kind": "physical",
|
|
"sandbox_strategy": "copy_on_write",
|
|
}
|
|
)
|
|
|
|
def time_from_config_full(self) -> None:
|
|
"""Benchmark full type spec construction with all fields."""
|
|
ResourceTypeSpec.from_config(
|
|
{
|
|
"name": "bench/full",
|
|
"description": "Full benchmark type",
|
|
"resource_kind": "physical",
|
|
"sandbox_strategy": "git_worktree",
|
|
"user_addable": True,
|
|
"built_in": False,
|
|
"cli_args": [
|
|
{
|
|
"name": "path",
|
|
"type": "path",
|
|
"required": True,
|
|
"description": "Path to resource",
|
|
},
|
|
{
|
|
"name": "branch",
|
|
"type": "string",
|
|
"required": False,
|
|
"description": "Branch name",
|
|
"default": "main",
|
|
},
|
|
],
|
|
"parent_types": ["git-checkout"],
|
|
"child_types": ["fs-directory", "fs-file"],
|
|
"handler": "bench.handler:BenchHandler",
|
|
"capabilities": {
|
|
"read": True,
|
|
"write": True,
|
|
"sandbox": True,
|
|
"checkpoint": False,
|
|
},
|
|
"auto_discovery": {
|
|
"enabled": True,
|
|
"rules": [
|
|
{"type": "fs-directory", "pattern": "*/"},
|
|
],
|
|
},
|
|
}
|
|
)
|
|
|
|
|
|
class RegistryLookupSuite:
|
|
"""Benchmark registry service lookup operations."""
|
|
|
|
def setup(self) -> None:
|
|
self._sf = _setup_db()
|
|
self._svc = ResourceRegistryService(session_factory=self._sf)
|
|
self._svc.bootstrap_builtin_types()
|
|
|
|
# Register some resources for lookup benchmarks
|
|
self._resources = []
|
|
for i in range(20):
|
|
r = self._svc.register_resource(
|
|
type_name="git-checkout",
|
|
name=f"bench/repo-{i}",
|
|
location=f"/tmp/bench/repo-{i}",
|
|
description=f"Benchmark repo {i}",
|
|
)
|
|
self._resources.append(r)
|
|
|
|
def time_show_type_builtin(self) -> None:
|
|
"""Benchmark looking up a built-in type by name."""
|
|
self._svc.show_type("git-checkout")
|
|
|
|
def time_show_type_second_builtin(self) -> None:
|
|
"""Benchmark looking up the second built-in type."""
|
|
self._svc.show_type("fs-directory")
|
|
|
|
def time_list_types(self) -> None:
|
|
"""Benchmark listing all registered types."""
|
|
self._svc.list_types()
|
|
|
|
def time_list_types_filtered(self) -> None:
|
|
"""Benchmark listing types filtered by namespace."""
|
|
self._svc.list_types(namespace="builtin")
|
|
|
|
def time_show_resource_by_name(self) -> None:
|
|
"""Benchmark looking up a resource by namespaced name."""
|
|
self._svc.show_resource("bench/repo-0")
|
|
|
|
def time_show_resource_by_ulid(self) -> None:
|
|
"""Benchmark looking up a resource by ULID."""
|
|
self._svc.show_resource(self._resources[0].resource_id)
|
|
|
|
def time_list_resources_all(self) -> None:
|
|
"""Benchmark listing all resources."""
|
|
self._svc.list_resources()
|
|
|
|
def time_list_resources_filtered(self) -> None:
|
|
"""Benchmark listing resources filtered by type."""
|
|
self._svc.list_resources(type_name="git-checkout")
|
|
|
|
|
|
class RegistryRegistrationSuite:
|
|
"""Benchmark resource registration throughput."""
|
|
|
|
_reg_ctr: int = 0
|
|
|
|
def setup(self) -> None:
|
|
self._sf = _setup_db()
|
|
self._svc = ResourceRegistryService(session_factory=self._sf)
|
|
self._svc.bootstrap_builtin_types()
|
|
|
|
def time_register_resource(self) -> None:
|
|
"""Benchmark registering a single resource."""
|
|
RegistryRegistrationSuite._reg_ctr += 1
|
|
self._svc.register_resource(
|
|
type_name="git-checkout",
|
|
name=f"bench/reg-{RegistryRegistrationSuite._reg_ctr}",
|
|
location=f"/tmp/bench/reg-{RegistryRegistrationSuite._reg_ctr}",
|
|
)
|
|
|
|
def time_bootstrap_builtin_types_idempotent(self) -> None:
|
|
"""Benchmark idempotent bootstrap (types already exist)."""
|
|
self._svc.bootstrap_builtin_types()
|