50316e97be
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Failing after 15s
CI / quality (pull_request) Successful in 20s
CI / build (pull_request) Successful in 23s
CI / security (pull_request) Successful in 31s
CI / typecheck (pull_request) Successful in 36s
CI / coverage (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 2m23s
CI / unit_tests (pull_request) Failing after 5m47s
CI / docker (pull_request) Has been skipped
124 lines
3.4 KiB
Python
124 lines
3.4 KiB
Python
"""ASV benchmarks for LSP registry lookup performance.
|
|
|
|
Measures the performance of:
|
|
- LspServerConfig creation
|
|
- Registry register and get operations
|
|
- Registry list with filters (namespace, language)
|
|
- Registry remove
|
|
- Tool adapter spec generation
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Ensure the local *source* tree is importable
|
|
_SRC = str(Path(__file__).resolve().parents[1] / "src")
|
|
if _SRC not in sys.path:
|
|
sys.path.insert(0, _SRC)
|
|
|
|
# Force-reload the top-level package
|
|
import cleveragents # noqa: E402
|
|
|
|
importlib.reload(cleveragents)
|
|
|
|
from cleveragents.lsp.models import ( # noqa: E402
|
|
LspCapability,
|
|
LspServerConfig,
|
|
)
|
|
from cleveragents.lsp.registry import LspRegistry # noqa: E402
|
|
from cleveragents.lsp.tool_adapter import LspToolAdapter # noqa: E402
|
|
|
|
|
|
def _make_config(
|
|
name: str,
|
|
command: str = "stub-cmd",
|
|
languages: list[str] | None = None,
|
|
capabilities: list[LspCapability] | None = None,
|
|
) -> LspServerConfig:
|
|
return LspServerConfig(
|
|
name=name,
|
|
command=command,
|
|
languages=languages or [],
|
|
capabilities=capabilities or [],
|
|
)
|
|
|
|
|
|
class TimeLspConfigCreation:
|
|
"""Benchmark LspServerConfig creation."""
|
|
|
|
def time_create_minimal(self) -> None:
|
|
LspServerConfig(name="local/test", command="test-cmd")
|
|
|
|
def time_create_with_languages(self) -> None:
|
|
LspServerConfig(
|
|
name="local/test",
|
|
command="test-cmd",
|
|
languages=["python", "javascript", "typescript"],
|
|
)
|
|
|
|
def time_create_with_capabilities(self) -> None:
|
|
LspServerConfig(
|
|
name="local/test",
|
|
command="test-cmd",
|
|
capabilities=list(LspCapability),
|
|
)
|
|
|
|
|
|
class TimeLspRegistryOperations:
|
|
"""Benchmark registry register, get, and remove."""
|
|
|
|
def setup(self) -> None:
|
|
self.registry = LspRegistry()
|
|
for i in range(100):
|
|
ns = "local" if i % 2 == 0 else "remote"
|
|
lang = "python" if i % 3 == 0 else "typescript"
|
|
self.registry.register(
|
|
_make_config(
|
|
f"{ns}/server-{i}",
|
|
languages=[lang],
|
|
capabilities=[LspCapability.DIAGNOSTICS],
|
|
)
|
|
)
|
|
|
|
def time_get_existing(self) -> None:
|
|
self.registry.get("local/server-0")
|
|
|
|
def time_get_missing(self) -> None:
|
|
self.registry.get("local/nonexistent")
|
|
|
|
def time_list_all(self) -> None:
|
|
self.registry.list_servers()
|
|
|
|
def time_list_with_namespace_filter(self) -> None:
|
|
self.registry.list_servers(namespace="local")
|
|
|
|
def time_list_with_language_filter(self) -> None:
|
|
self.registry.list_servers(language="python")
|
|
|
|
def time_contains_check(self) -> None:
|
|
_ = "local/server-0" in self.registry
|
|
|
|
|
|
class TimeLspToolAdapter:
|
|
"""Benchmark tool adapter spec generation."""
|
|
|
|
def setup(self) -> None:
|
|
self.config_few = _make_config(
|
|
"local/test",
|
|
capabilities=[LspCapability.DIAGNOSTICS, LspCapability.COMPLETIONS],
|
|
)
|
|
self.config_all = _make_config(
|
|
"local/test-all",
|
|
capabilities=list(LspCapability),
|
|
)
|
|
self.adapter = LspToolAdapter()
|
|
|
|
def time_generate_few_specs(self) -> None:
|
|
self.adapter.generate_tool_specs(self.config_few)
|
|
|
|
def time_generate_all_specs(self) -> None:
|
|
self.adapter.generate_tool_specs(self.config_all)
|