92c83ecc7e
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 16s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 19s
CI / typecheck (pull_request) Successful in 33s
CI / security (pull_request) Successful in 35s
CI / integration_tests (pull_request) Successful in 2m41s
CI / unit_tests (pull_request) Successful in 6m18s
CI / docker (pull_request) Successful in 1m2s
CI / benchmark-regression (pull_request) Successful in 15m41s
CI / coverage (pull_request) Failing after 20m52s
122 lines
3.9 KiB
Python
122 lines
3.9 KiB
Python
"""ASV benchmarks for session persistence (repository + service layer).
|
|
|
|
Measures the performance of:
|
|
- SessionRepository.create() round-trip
|
|
- SessionRepository.get_by_id() lookup
|
|
- SessionRepository.list_all() listing
|
|
- SessionMessageRepository.append() single message
|
|
- SessionMessageRepository.get_for_session() retrieval
|
|
- PersistentSessionService.export_session() with messages
|
|
- PersistentSessionService.import_session() from export dict
|
|
- PersistentSessionService.update_token_usage()
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
except ModuleNotFoundError:
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
|
|
from cleveragents.application.services.session_service import (
|
|
PersistentSessionService,
|
|
)
|
|
from cleveragents.domain.models.core.session import MessageRole
|
|
from cleveragents.infrastructure.database.models import Base
|
|
from cleveragents.infrastructure.database.repositories import (
|
|
SessionMessageRepository,
|
|
SessionRepository,
|
|
)
|
|
|
|
|
|
def _make_service():
|
|
"""Create in-memory DB and service."""
|
|
engine = create_engine("sqlite:///:memory:", echo=False)
|
|
Base.metadata.create_all(engine)
|
|
factory = sessionmaker(bind=engine, expire_on_commit=False)
|
|
db_session = factory()
|
|
|
|
def get_session():
|
|
return db_session
|
|
|
|
session_repo = SessionRepository(get_session)
|
|
message_repo = SessionMessageRepository(get_session)
|
|
svc = PersistentSessionService(session_repo, message_repo)
|
|
return svc, db_session
|
|
|
|
|
|
class SessionPersistenceSuite:
|
|
"""Benchmark session persistence operations."""
|
|
|
|
def setup(self):
|
|
self.svc, self.db_session = _make_service()
|
|
self.session = self.svc.create()
|
|
self.db_session.commit()
|
|
# Pre-populate messages for retrieval benchmarks
|
|
for i in range(20):
|
|
self.svc.append_message(
|
|
self.session.session_id,
|
|
MessageRole.USER,
|
|
f"Benchmark message {i}",
|
|
)
|
|
self.db_session.commit()
|
|
|
|
def time_session_create(self):
|
|
"""Benchmark creating a new session."""
|
|
self.svc.create()
|
|
self.db_session.commit()
|
|
|
|
def time_session_get_by_id(self):
|
|
"""Benchmark getting a session by ID."""
|
|
self.svc.get(self.session.session_id)
|
|
|
|
def time_session_list_all(self):
|
|
"""Benchmark listing all sessions."""
|
|
self.svc.list()
|
|
|
|
def time_message_append(self):
|
|
"""Benchmark appending a single message."""
|
|
self.svc.append_message(
|
|
self.session.session_id,
|
|
MessageRole.USER,
|
|
"Benchmark append",
|
|
)
|
|
self.db_session.commit()
|
|
|
|
def time_export_session(self):
|
|
"""Benchmark exporting a session with 20 messages."""
|
|
self.svc.export_session(self.session.session_id)
|
|
|
|
def time_update_token_usage(self):
|
|
"""Benchmark updating token usage."""
|
|
self.svc.update_token_usage(self.session.session_id, 100, 50, 0.005)
|
|
self.db_session.commit()
|
|
|
|
|
|
class SessionImportSuite:
|
|
"""Benchmark session import operations."""
|
|
|
|
def setup(self):
|
|
self.svc, self.db_session = _make_service()
|
|
session = self.svc.create(actor_name="local/bench-actor")
|
|
self.db_session.commit()
|
|
for i in range(10):
|
|
self.svc.append_message(
|
|
session.session_id,
|
|
MessageRole.USER,
|
|
f"Import benchmark message {i}",
|
|
)
|
|
self.db_session.commit()
|
|
self.export_data = self.svc.export_session(session.session_id)
|
|
|
|
def time_import_session(self):
|
|
"""Benchmark importing a session with 10 messages."""
|
|
self.svc.import_session(self.export_data)
|
|
self.db_session.commit()
|