Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions codeflash/code_utils/edit_generated_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from codeflash.cli_cmds.console import logger
from codeflash.code_utils.time_utils import format_perf, format_time
from codeflash.models.models import GeneratedTests, GeneratedTestsList
from codeflash.result.critic import performance_gain

if TYPE_CHECKING:
from codeflash.models.models import InvocationId
Expand Down Expand Up @@ -42,12 +41,11 @@ def get_comment(self, match_key: str) -> str:
# calculate speedup and output comment
original_time = self.original_runtimes[match_key]
optimized_time = self.optimized_runtimes[match_key]
perf_gain = format_perf(
abs(performance_gain(original_runtime_ns=original_time, optimized_runtime_ns=optimized_time) * 100)
)
perf_gain_value = (original_time - optimized_time) / optimized_time if optimized_time != 0 else 0.0
perf_gain_str = format_perf(abs(perf_gain_value * 100))
status = "slower" if optimized_time > original_time else "faster"
# Create the runtime comment
return f"# {format_time(original_time)} -> {format_time(optimized_time)} ({perf_gain}% {status})"
return f"# {format_time(original_time)} -> {format_time(optimized_time)} ({perf_gain_str}% {status})"

def visit_FunctionDef(self, node: ast.FunctionDef) -> ast.FunctionDef:
self.context_stack.append(node.name)
Expand Down
43 changes: 15 additions & 28 deletions codeflash/code_utils/time_utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import annotations

import datetime as dt
import re

Expand Down Expand Up @@ -58,42 +60,27 @@ def format_time(nanoseconds: int) -> str:
raise TypeError("Input must be an integer.")
if nanoseconds < 0:
raise ValueError("Input must be a positive integer.")
conversions = [(1_000_000_000, "s"), (1_000_000, "ms"), (1_000, "μs"), (1, "ns")]

# Handle nanoseconds case directly (no decimal formatting needed)
if nanoseconds < 1_000:
return f"{nanoseconds}ns"

# Find appropriate unit
for divisor, unit in conversions:
if nanoseconds >= divisor:
value = nanoseconds / divisor
int_value = nanoseconds // divisor

# Use integer formatting for values >= 100
if int_value >= 100:
formatted_value = f"{int_value:.0f}"
# Format with precision for 3 significant digits
elif value >= 100:
formatted_value = f"{value:.0f}"
elif value >= 10:
formatted_value = f"{value:.1f}"
else:
formatted_value = f"{value:.2f}"

return f"{formatted_value}{unit}"

# This should never be reached, but included for completeness
return f"{nanoseconds}ns"
if nanoseconds < 1_000_000:
value = nanoseconds / 1_000
return f"{value:.2f}μs" if value < 10 else (f"{value:.1f}μs" if value < 100 else f"{int(value)}μs")
if nanoseconds < 1_000_000_000:
value = nanoseconds / 1_000_000
return f"{value:.2f}ms" if value < 10 else (f"{value:.1f}ms" if value < 100 else f"{int(value)}ms")
value = nanoseconds / 1_000_000_000
return f"{value:.2f}s" if value < 10 else (f"{value:.1f}s" if value < 100 else f"{int(value)}s")


def format_perf(percentage: float) -> str:
"""Format percentage into a human-readable string with 3 significant digits when needed."""
percentage_abs = abs(percentage)
if percentage_abs >= 100:
# Branch order optimized
abs_perc = abs(percentage)
if abs_perc >= 100:
return f"{percentage:.0f}"
if percentage_abs >= 10:
if abs_perc >= 10:
return f"{percentage:.1f}"
if percentage_abs >= 1:
if abs_perc >= 1:
return f"{percentage:.2f}"
return f"{percentage:.3f}"
Loading