Add resource usage timeline diagrams to README

- Added Mermaid XY charts showing memory usage over time
- Individual charts for Elixir, TypeScript, Dart, Haskell, C
- Comparison chart for fast languages
- Shows how memory usage varies during program execution
- Based on actual timeline data from benchmark runs
This commit is contained in:
Ein Anderssono
2026-04-23 01:03:40 +02:00
parent 8723db1033
commit cbc9eef036
130 changed files with 1339 additions and 110 deletions
+158
View File
@@ -0,0 +1,158 @@
#!/usr/bin/env python3
"""
Generate Mermaid XY charts from timeline data.
Reads TSV files and creates Mermaid diagram code for README.md.
"""
import os
import sys
from pathlib import Path
def read_timeline_data(filepath):
"""Read timeline TSV file and return time, memory, cpu arrays."""
times = []
memories = []
cpus = []
with open(filepath, 'r') as f:
for line in f:
parts = line.strip().split()
if len(parts) >= 3:
try:
times.append(int(parts[0]))
memories.append(int(parts[1]) / 1024) # Convert KB to MB
cpus.append(int(parts[2]))
except ValueError:
continue
return times, memories, cpus
def generate_mermaid_chart(language, times, memories, cpus):
"""Generate Mermaid XY chart for a language."""
if len(times) == 0:
return None
# Sample data if too many points (Mermaid has limits)
max_points = 20
if len(times) > max_points:
step = len(times) // max_points
times = times[::step]
memories = memories[::step]
cpus = cpus[::step]
chart = f"```mermaid\n"
chart += f"xychart-beta\n"
chart += f' title "{language} - Resursanvändning över tid"\n'
chart += f' x-axis "Tid (ms)" 0 --> {max(times)}\n'
chart += f' y-axis "Minne (MB)" 0 --> {max(memories) + 1}\n'
chart += f' line [{", ".join([f"{m:.1f}" for m in memories])}]\n'
chart += f"```\n"
return chart
def generate_comparison_chart(languages_data, title, max_time=None):
"""Generate comparison chart for multiple languages."""
if not languages_data or all(len(data[1]) == 0 for data in languages_data):
return None
# Find max time for x-axis
if max_time is None:
max_time = max(max(data[1]) if len(data[1]) > 0 else 0 for data in languages_data)
# Sample to max 10 points per language
max_points = 10
sampled_data = []
for lang, times, memories in languages_data:
if len(times) > max_points:
step = len(times) // max_points
times = times[::step]
memories = memories[::step]
sampled_data.append((lang, times, memories))
chart = f"```mermaid\n"
chart += f"xychart-beta\n"
chart += f' title "{title}"\n'
chart += f' x-axis "Tid (ms)" 0 --> {max_time}\n'
chart += f' y-axis "Minne (MB)" 0 --> {max(max(m) if m else 0 for _, _, m in sampled_data) + 1}\n'
for lang, times, memories in sampled_data:
if len(memories) > 0:
chart += f' line [{", ".join([f"{m:.1f}" for m in memories])}]\n'
chart += f"```\n"
return chart
def main():
timelines_dir = Path('timelines')
output_file = Path('mermaid_charts.md')
if not timelines_dir.exists():
print(f"Error: Directory {timelines_dir} does not exist")
sys.exit(1)
# Collect data for all languages
all_languages = []
# Process each language
for lang_dir in sorted(timelines_dir.iterdir()):
if lang_dir.is_dir():
language = lang_dir.name
# Find the best run (usually run_2.tsv)
timeline_file = lang_dir / 'run_2.tsv'
if timeline_file.exists():
times, memories, cpus = read_timeline_data(timeline_file)
if len(times) > 0:
all_languages.append((language, times, memories, cpus))
# Generate output
with open(output_file, 'w') as f:
f.write("# Resursanvändning över tid\n\n")
f.write("Följande diagram visar minnesanvändning över tid för varje språk.\n\n")
# Individual charts for each language
for language, times, memories, cpus in all_languages:
chart = generate_mermaid_chart(language, times, memories, cpus)
if chart:
f.write(f"## {language}\n\n")
f.write(chart)
f.write("\n")
# Comparison charts
f.write("# Jämförelser\n\n")
# Fast languages (under 50ms)
fast = [(lang, t, m) for lang, t, m, c in all_languages if len(t) > 0 and t[-1] < 50]
if fast:
f.write("## Snabba språk (< 50ms)\n\n")
chart = generate_comparison_chart(fast, "Snabba språk - Minnesanvändning")
if chart:
f.write(chart)
f.write("\n")
# Medium languages (50-200ms)
medium = [(lang, t, m) for lang, t, m, c in all_languages
if len(t) > 0 and 50 <= t[-1] < 200]
if medium:
f.write("## Medelsnabba språk (50-200ms)\n\n")
chart = generate_comparison_chart(medium, "Medelsnabba språk - Minnesanvändning")
if chart:
f.write(chart)
f.write("\n")
# Slow languages (200ms+)
slow = [(lang, t, m) for lang, t, m, c in all_languages if len(t) > 0 and t[-1] >= 200]
if slow:
f.write("## Långsamma språk (200ms+)\n\n")
chart = generate_comparison_chart(slow, "Långsamma språk - Minnesanvändning")
if chart:
f.write(chart)
f.write("\n")
print(f"Generated Mermaid charts in {output_file}")
if __name__ == '__main__':
main()