mirror of
https://github.com/codeflash-ai/codeflash.git
synced 2026-05-04 18:25:17 +00:00
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.
56 lines
2.5 KiB
Python
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)
|