Beancount 的技术优势:与 Ledger、hledger 和 GnuCash 的性能、Python API 和数据完整性深度对比
· 阅读需 7 分钟
选择个人会计系统需要在性能、数据架构和可扩展性之间进行权衡。对于工程师和其他技术用户来说,选择通常取决于哪个系统提供最健壮、可预测和可编程的基础。
根据一份详细的比较报告,让我们分析 Beancount 与其流行的开源替代方案 Ledger-CLI、hledger 和 GnuCash 的技术细节。
速度和性能:量化基准 🚀
对于任何严肃的数据集,性能都是不可协商的。 Beancount 的架构可以处理数十年的交易数据,而不会影响速度。尽管是用 Python(v2)实现的,但其高度优化的解析器效率非常高。
- Beancount: 实际使用表明,它可以在 大约 2 秒内加载和处理包含 数十万笔交易的账本。内存使用量适中;解析约 10 万笔交易只需使用几十兆字节的 RAM,即可将源文本转换为内存中的对象。
- 100 万笔交易压力测试: 使用包含 100 万笔交易、1,000 个账户和 100 万个价格条目的合成账本进行的基 准测试揭示了显著的架构差异:
- hledger(Haskell): 在 约 80.2 秒内成功完成完整解析和报告,处理速度约为 12,465 笔交易/秒,同时使用约 2.58 GB 的 RAM。
- Ledger-CLI(C++): 该进程在 40 分钟后终止,但未完成,这可能是由于已知的回归导致在处理高度复杂的账本时内存和 CPU 使用过多。
- Beancount: 虽然未包含在该特定 100 万笔交易测试中,但其性能曲线表明它可以有效地处理该任务。此外,即将推出的采用全新 C++ 核心和 Python API 的 Beancount v3 预计将在吞吐量方面带来另一个数量级的提升。
- GnuCash(C/Scheme): 作为将整个数据集加载到内存中的 GUI 应用程序,其性能会随着大小的增加而明显下降。打开一个约 50 MB 的 XML 文件(代表 10 万多笔交易)需要 77 秒。切换到 SQLite 后端仅略微将其缩短至 约 55 秒。
结论: Beancount 提供了可预测扩展的卓越性能,这是长期数据管理的关键特性。它避免了 Ledger 中出现的性能瓶颈和 GnuCash 的 UI 绑定延迟。
数据架构:纯文本与不透明数据库 📄
系统存储数据的方式决定了其透明度、可移植性和持久性。Beancount 使用简洁易懂的纯文本格式,这对技术用户来说更胜一筹。
- 紧凑高效: 一个包含 10 万笔交易的 Beancount 文件只有 约 8.8 MB