codeflash/.codeflash/benchmarks/test_benchmark_libcst_pipeline.py
Kevin Turcios ec14860d29 Move benchmarks to .codeflash/benchmarks/ and auto-discover
Move codeflash's own benchmarks to .codeflash/benchmarks/. Add
auto-discovery of .codeflash/benchmarks/ in codeflash compare and
benchmark mode -- when benchmarks-root is not explicitly configured,
the CLI checks for .codeflash/benchmarks/ before erroring.

Backwards compatible: users with existing benchmarks-root config
are unaffected. Docs continue to show tests/benchmarks as the
example path.
2026-04-10 08:39:15 -05:00

56 lines
2.5 KiB
Python

"""Benchmark the full libcst-heavy pipeline on a single file.
Runs discover → extract context → replace functions → add global assignments
in sequence, exercising ~15 distinct visitor/transformer classes in one pass.
"""
from __future__ import annotations
from pathlib import Path
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
from codeflash.languages.python.context.code_context_extractor import get_code_optimization_context
from codeflash.languages.python.static_analysis.code_extractor import add_global_assignments
from codeflash.languages.python.static_analysis.code_replacer import replace_functions_in_file
from codeflash.languages.python.support import PythonSupport
_CODEFLASH_ROOT = Path(__file__).parent.parent.parent.resolve() / "codeflash"
_PROJECT_ROOT = _CODEFLASH_ROOT.parent
# Target: a real, non-trivial file with classes and module-level functions.
_TARGET_FILE = _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_extractor.py"
_TARGET_FUNC = "add_global_assignments"
# A second file to serve as "optimized" source for replace/merge steps.
_SECOND_FILE = _CODEFLASH_ROOT / "languages" / "python" / "static_analysis" / "code_replacer.py"
def _run_pipeline() -> None:
"""Simulate a single-file optimization pass through the full visitor pipeline."""
source = _TARGET_FILE.read_text(encoding="utf-8")
source2 = _SECOND_FILE.read_text(encoding="utf-8")
# 1. Discover functions (FunctionVisitor + MetadataWrapper)
ps = PythonSupport()
functions = ps.discover_functions(source=source, file_path=_TARGET_FILE)
# 2. Extract code optimization context (multiple collectors + dependency resolver)
fto = FunctionToOptimize(
function_name=_TARGET_FUNC, file_path=_TARGET_FILE, parents=[], starting_line=None, ending_line=None
)
get_code_optimization_context(fto, _PROJECT_ROOT)
# 3. Replace functions (GlobalFunctionCollector + GlobalFunctionTransformer)
# Use a class method from discovered functions if available, else module-level.
func_names = [_TARGET_FUNC]
replace_functions_in_file(
source_code=source, original_function_names=func_names, optimized_code=source2, preexisting_objects=set()
)
# 4. Add global assignments (6 visitors/transformers)
add_global_assignments(source2, source)
def test_benchmark_full_pipeline(benchmark) -> None:
"""Full discover → extract → replace → merge pipeline on one file."""
benchmark(_run_pipeline)