Files
crabrl/benchmarks/compare.py
Stefano Amorelli 46ecbd2635 feat: implement CLI for XBRL parsing and validation
- Parse command with optional stats flag
- Validate command with SEC EDGAR profile support
- Benchmark command for performance testing
- Colored output for better UX
2025-08-16 17:25:06 +03:00

71 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""
Compare crabrl performance with Arelle
"""
import subprocess
import time
import sys
from pathlib import Path
def run_crabrl(filepath):
"""Run crabrl and measure time"""
cmd = ["../target/release/crabrl", "parse", filepath]
start = time.perf_counter()
result = subprocess.run(cmd, capture_output=True, text=True)
elapsed = (time.perf_counter() - start) * 1000
if result.returncode == 0:
# Parse output for fact count
facts = 0
for line in result.stdout.split('\n'):
if 'Facts:' in line:
facts = int(line.split(':')[1].strip())
break
return elapsed, facts
return None, 0
def run_arelle(filepath):
"""Run Arelle and measure time"""
try:
cmd = ["python3", "-m", "arelle.CntlrCmdLine",
"--file", filepath, "--skipDTS", "--logLevel", "ERROR"]
start = time.perf_counter()
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
elapsed = (time.perf_counter() - start) * 1000
if result.returncode == 0:
return elapsed
return None
except:
return None
def main():
if len(sys.argv) < 2:
print("Usage: compare.py <xbrl-file>")
sys.exit(1)
filepath = sys.argv[1]
print(f"Comparing performance on: {filepath}\n")
# Run crabrl
crabrl_time, facts = run_crabrl(filepath)
if crabrl_time:
print(f"crabrl: {crabrl_time:.1f}ms ({facts} facts)")
else:
print("crabrl: Failed")
# Run Arelle
arelle_time = run_arelle(filepath)
if arelle_time:
print(f"Arelle: {arelle_time:.1f}ms")
else:
print("Arelle: Failed or not installed")
# Calculate speedup
if crabrl_time and arelle_time:
speedup = arelle_time / crabrl_time
print(f"\nSpeedup: {speedup:.1f}x faster")
if __name__ == "__main__":
main()