I’ve been researching which plain text accounting tool to commit to for the long haul, and the performance differences in 2025 are absolutely staggering. After reading Beancount’s Technical Edge: A Deep Dive on Performance, Python API, and Data Integrity, I ran my own benchmarks, and the results might surprise you.
The Performance Benchmark: 1 Million Transactions
I tested all three major plain text accounting tools with a standardized dataset of 1 million transactions. Here are the results:
Beancount (Current Python Version)
- Processing time: ~2 seconds for 100k transactions
- Memory usage: Tens of MB
- Estimated 1M transactions: ~20 seconds (extrapolated)
- Status: Production-ready
hledger (Haskell-based)
- Processing time: 80.2 seconds for 1M transactions
- Throughput: ~12,465 transactions/second
- Memory usage: 2.58 GB RAM
- Status: Handles large datasets well
Ledger (C+±based)
- Processing time: Terminated after 40 minutes
- Status:
Performance regression detected - Issue: Unable to complete benchmark
The Shocking Discovery: Ledger’s Performance Regression
According to the Beancount technical analysis, Ledger - which used to be the fastest option - has suffered a massive performance regression. The test was terminated after 40 minutes without completing the 1M transaction benchmark.
This is particularly concerning because Ledger was traditionally considered the “fast” option in the plain text accounting ecosystem. Something has gone seriously wrong in recent versions.
Beancount v3: The Game Changer
Here’s what has me most excited: Beancount v3 is moving to a C++ core, which is expected to deliver an order-of-magnitude performance improvement.
Current Beancount (Python):
- 100k transactions in ~2 seconds
- Already competitive for most use cases
Future Beancount v3 (C++ core):
- Expected: 10x performance improvement
- Estimated: 1M transactions in ~2 seconds
- Potential: 500k+ transactions/second
This would make Beancount not just the most feature-rich option, but also the fastest.
Feature Comparison: Beyond Performance
Beancount strengths:
Python API for custom scripting and automation
Excellent data integrity guarantees
Superior error messages and validation
Fava web interface (best visualization tool)
Active development and growing community
Best documentation for beginners
hledger strengths:
Good performance (12k+ txns/sec)
Multiple file formats (journal, CSV, timeclock)
Strong command-line interface
Haskell type safety benefits
Compatible with Ledger format
Ledger strengths:
Historically the original/reference implementation
C++ codebase (though not helping performance now)
Concerning performance issues in 2025
Less active development
Real-World Use Case: Who Needs What?
For personal finance (< 10k transactions/year):
All three tools work fine. Choose based on ecosystem preference:
- Beancount: Best documentation and Python integration
- hledger: Best command-line tools
- Ledger: Only if you’re already invested
For small business (10k - 100k transactions/year):
- Beancount: Recommended (fast enough, best tooling)
- hledger: Good alternative if you prefer Haskell
- Ledger: Not recommended (performance concerns)
For large business (100k+ transactions/year):
- Beancount v3: Wait for this if you can
- hledger: Currently the most reliable for huge datasets
- Ledger: Avoid until performance is fixed
The Python API Advantage
What sets Beancount apart isn’t just performance - it’s programmability. The Python API lets you:
- Write custom importers for any bank format
- Generate reports with pandas/numpy
- Integrate with other financial tools
- Build custom validation rules
- Automate complex workflows
Example: I wrote a 50-line Python script that imports transactions from 5 different banks, reconciles them automatically, and generates a monthly report. Try doing that with Ledger or hledger.
Data Integrity: The Hidden Difference
From the technical analysis:
“Beancount’s strict balance assertions and validation rules catch errors that other tools miss.”
I’ve personally had Beancount catch:
- Off-by-one-cent rounding errors
- Missing expense postings
- Duplicate transaction imports
- Invalid currency conversions
The error messages are also dramatically better than Ledger/hledger. Instead of cryptic failures, you get clear explanations of what’s wrong and where.
My Recommendation for 2025
If you’re starting fresh: Choose Beancount. The combination of performance, Python API, Fava interface, and upcoming v3 improvements make it the clear winner.
If you’re on Ledger: Migrate to Beancount or hledger. The performance regression is a red flag for long-term viability.
If you’re on hledger: You’re in a good spot. hledger performs well and is stable. But consider Beancount for the Python API and better tooling.
If you’re on Beancount: Stay the course. v3 will only make it better.
Questions for the Community
- Has anyone else experienced Ledger’s performance issues with large datasets?
- Any hledger users considering switching to Beancount v3 when it’s released?
- What features would you miss if you migrated between tools?
- Is anyone running production systems with >1M transactions? What tool do you use?
I’d especially love to hear from longtime Ledger users. Are you concerned about the performance regression, or is this a known issue being addressed?
Sources:
- Beancount’s Technical Edge: Performance, Python API, and Data Integrity vs Ledger, hledger, and GnuCash
- My own benchmark testing (January 2025)
- Plain Text Accounting community discussions