mirror of
https://github.com/stefanoamorelli/crabrl.git
synced 2026-04-18 07:10:42 +00:00
- Parse command with optional stats flag - Validate command with SEC EDGAR profile support - Benchmark command for performance testing - Colored output for better UX
71 lines
1.9 KiB
Python
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() |