Files
print_hej/update_memory_bytes.py
Ein Anderssono 43870e5920 Reorganize documentation: create separate reports for each decimal level
- Create reports/ directory with detailed performance reports
- Simplify README.md to provide overview and summary
- Add links to detailed reports for each decimal level (1, 2, 5, 10, 100, 1000, 2000)
- Keep summary table and key findings in main README
- Remove verbose charts from main README to reduce noise
2026-04-23 10:16:20 +02:00

143 lines
5.1 KiB
Python

#!/usr/bin/env python3
"""Extract actual memory values in bytes from timeline files and update README."""
import os
import re
from pathlib import Path
# Language categories
COMPILED = ["Assembly", "C", "C++", "Rust", "Go", "Nim", "Odin", "Fortran", "Swift", "Crystal"]
JIT = ["Java", "CSharp", "Kotlin", "Julia"]
INTERPRETED = ["Python", "Perl", "PHP", "Ruby", "JavaScript"]
# Map directory names to display names
NAME_MAP = {
"CSharp": "C#",
"C++": "C++",
}
def get_peak_memory(lang_dir):
"""Get peak memory in bytes from timeline files."""
timeline_dir = Path(f"timelines/{lang_dir}")
if not timeline_dir.exists():
return 0
peak_memory = 0
for tsv_file in timeline_dir.glob("run_*.tsv"):
try:
with open(tsv_file, 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 2:
try:
memory = int(parts[1])
peak_memory = max(peak_memory, memory)
except ValueError:
continue
except Exception as e:
print(f"Error reading {tsv_file}: {e}")
continue
return peak_memory
def get_avg_memory(lang_dir):
"""Get average memory in bytes from timeline files."""
timeline_dir = Path(f"timelines/{lang_dir}")
if not timeline_dir.exists():
return 0
total_memory = 0
count = 0
for tsv_file in timeline_dir.glob("run_*.tsv"):
try:
with open(tsv_file, 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 2:
try:
memory = int(parts[1])
total_memory += memory
count += 1
except ValueError:
continue
except Exception as e:
print(f"Error reading {tsv_file}: {e}")
continue
return total_memory // count if count > 0 else 0
def update_readme():
"""Update README with actual memory values in bytes."""
# Read current README
with open('README.md', 'r') as f:
content = f.read()
# Update compiled languages memory chart
compiled_memories = []
for lang in COMPILED:
memory = get_peak_memory(lang)
compiled_memories.append(memory)
# Find and replace compiled languages memory chart
pattern = r'(title "Compiled Languages - Memory Usage \(bytes\) at 100 decimals".*?y-axis "Memory \(bytes\)" 0 --> )\d+'
max_memory = max(compiled_memories) if compiled_memories else 0
y_max = max(100, max_memory) # At least 100 bytes scale
replacement = f'\\g<1>{y_max}'
content = re.sub(pattern, replacement, content)
# Replace memory values in compiled languages chart
pattern = r'(title "Compiled Languages - Memory Usage \(bytes\) at 100 decimals".*?bar \[).*?(\])'
values_str = ', '.join(map(str, compiled_memories))
replacement = f'\\g<1>{values_str}\\g<2>'
content = re.sub(pattern, replacement, content, flags=re.DOTALL)
# Update JIT languages memory chart
jit_memories = []
for lang in JIT:
memory = get_peak_memory(lang)
jit_memories.append(memory)
pattern = r'(title "JIT-Compiled Languages - Memory Usage \(bytes\) at 100 decimals".*?y-axis "Memory \(bytes\)" 0 --> )\d+'
max_memory = max(jit_memories) if jit_memories else 0
y_max = max(100, max_memory)
replacement = f'\\g<1>{y_max}'
content = re.sub(pattern, replacement, content)
# Replace memory values in JIT languages chart
pattern = r'(title "JIT-Compiled Languages - Memory Usage \(bytes\) at 100 decimals".*?bar \[).*?(\])'
values_str = ', '.join(map(str, jit_memories))
replacement = f'\\g<1>{values_str}\\g<2>'
content = re.sub(pattern, replacement, content, flags=re.DOTALL)
# Update interpreted languages memory chart
interpreted_memories = []
for lang in INTERPRETED:
memory = get_peak_memory(lang)
interpreted_memories.append(memory)
pattern = r'(title "Interpreted Languages - Memory Usage \(bytes\) at 100 decimals".*?y-axis "Memory \(bytes\)" 0 --> )\d+'
max_memory = max(interpreted_memories) if interpreted_memories else 0
y_max = max(100, max_memory)
replacement = f'\\g<1>{y_max}'
content = re.sub(pattern, replacement, content)
# Replace memory values in interpreted languages chart
pattern = r'(title "Interpreted Languages - Memory Usage \(bytes\) at 100 decimals".*?bar \[).*?(\])'
values_str = ', '.join(map(str, interpreted_memories))
replacement = f'\\g<1>{values_str}\\g<2>'
content = re.sub(pattern, replacement, content, flags=re.DOTALL)
# Write updated README
with open('README.md', 'w') as f:
f.write(content)
print("Updated README with actual memory values in bytes:")
print(f"Compiled: {compiled_memories}")
print(f"JIT: {jit_memories}")
print(f"Interpreted: {interpreted_memories}")
if __name__ == "__main__":
update_readme()