← 最新论文
💻 computer science

JEDI: Java Evaluation of Declarative and Imperative Queries

本文介绍了 JEDI,这是一个自动生成的基准测试套件,它将 SQL 查询转换为 Java 代码,以评估和比较声明式 Stream API 实现与命令式基准的性能,旨在识别低效的代码模式并指导 Java Stream API 的优化。

原作者: Filippo Schiavio, Walter Binder

发布于 2026-05-25
📖 1 分钟阅读☕ 轻松阅读

原作者: Filippo Schiavio, Walter Binder

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象一下,你有一个堆满箱子(数据)的巨大仓库,你需要找到特定物品、对它们进行排序并计数。你有两种向工人下达指令的方式:

  1. “经理”方法(命令式):你走到每个工人面前,逐一说道:“拿起这个箱子。检查它是否是红色的。如果是,把它放进一堆;如果不是,就扔掉。现在拿起下一个。”这种方式非常直接且迅速,但需要大量的口头沟通,如果你有成千上万名工人,场面可能会变得混乱。
  2. “工头”方法(Java Stream API):你写下一张简洁优雅的便条:“取走所有箱子,筛选出红色的,按大小排序,然后计数。”你将这张便条交给一位工头,由他负责安排工人如何执行。这对你来说编写和阅读都容易得多,但工头需要将你的便条转化为具体行动,这有时会耗费额外时间。

这篇题为JEDI的论文,旨在测试“工头”(Java Stream API)的表现与“经理”(传统代码)相比如何,并研究如何让工头工作得更快。

问题所在

Java Stream API 之所以流行,是因为它让代码看起来整洁且易于理解(就像给工头的便条)。然而,开发人员一直怀疑,这种“整洁”的编码方式比“杂乱”的传统方式更慢。问题在于,没有人拥有一个合适的赛道(基准测试)来公平地测试这一点。没有赛道,构建 Java 语言的人(“机械师”)就不知道引擎究竟在哪里出现卡顿,开发人员也不知道哪些指令能带来最佳速度。

解决方案:JEDI

作者构建了JEDI(声明式与命令式查询的 Java 评估)。可以将 JEDI 想象成一个巨大的自动化工厂,它接收标准的数据库查询(用一种称为 SQL 的语言编写,这就像一种通用的请求表单),并立即将它们翻译成两组不同的指令:

  1. 一组使用“工头”风格(流)。
  2. 一组使用“经理”风格(命令式循环)。

由于该工厂将完全相同的查询翻译成两种风格,因此比较是绝对公平的。这就像让两名跑步者跑完全相同的路线,并计时看谁更快。

他们的发现

1. 微小的调整带来巨大的差异(“过滤器融合”)
有时,如果你给工头三张单独的便条:“检查红色”、“检查大”、“检查重”,工头会感到困惑。

  • 解决方法:作者发现,将这些便条合并成一张大便条(“检查红色且大且重”)会让工头快得多。这就像给工人一条清晰的指令,而不是三条令人困惑的指令。
  • 结果:在某些情况下,这一简单改变使代码运行速度提高了2.6 倍

2. “一对多”技巧
有时,一个箱子里装有许多更小的物品。

  • 旧方法:工头会拿起箱子,打开它,取出一个物品,放入一堆,再回去取出下一个,如此重复。
  • 新方法:作者发现了一种特殊工具(称为 mapMulti),它允许工头打开箱子,一次性将所有物品平滑地倾倒出来。
  • 结果:这甚至比第一个技巧更有效,通常能使速度翻倍。

3. 并行性谜题(使用多名工人)
当你拥有一个巨大的仓库时,你希望同时使用多名工人(并行处理)。该论文测试了四种不同的组织这些工人的方式:

  • “严格顺序”团队:所有人排成一队,依次传递箱子。这有利于保持秩序,但速度较慢。
  • “混乱”团队:所有人随机抓取箱子。速度快,但难以管理。
  • “共享白板”团队:所有人将结果写在一张巨大的共享白板上。
  • “原子”团队:所有人使用一种特殊的、高科技的笔,即使两人同时书写也不会弄脏。

裁决:没有单一的“最佳”团队。

  • 如果你只有非常少的组需要排序(例如只排序 4 种水果),“严格顺序”或“混乱”团队最快,因为“共享白板”会变得过于拥挤(关于谁先写的争论太多)。
  • 如果你有数千个组(例如排序 10,000 种不同的水果),“共享白板”团队获胜,因为争论停止了,每个人都可以书写自己的部分而不会相互碰撞。

4. 速度差距
核心问题:“工头”(流)是否比“经理”(命令式)慢?

  • 是的。传统的“经理”代码始终更快,通常快约30% 到 40%
  • 为什么? “工头”必须花时间将你那优雅的便条转化为行动。而“经理”则立即开始工作。
  • 好消息:差距并不像人们过去认为的那么大。Java 团队一直在改进引擎。然而,对于绝对最快的性能,“经理”风格仍然胜出。

5. 权衡:速度与理智
该论文还考察了代码的阅读难度。

  • “经理”代码(最快)就像一本密集且令人困惑的说明书。它难以阅读,且容易出错。
  • “工头”代码(较慢)就像一篇清晰简短的故事。它更容易理解,且出错的可能性更小。
  • 教训:你必须做出选择。你是希望代码运行速度快 30%,还是希望它对于人类来说更容易阅读和维护(快 2.5 倍)?该论文建议,对于大多数人来说,“工头”风格值得付出微小的速度代价,因为它节省了调试和维护的时间。

总结

JEDI 是一个新工具,帮助开发人员理解使用现代、易读的 Java Stream API 的“成本”。它证明,虽然易读的代码比老式代码稍慢,但你可以通过使用特定技巧(如合并过滤器)使其快得多。它还根据数据量的多少,明确告诉开发人员如何组织他们的工人(并行策略)。最终,它为开发人员提供了一条路线图,以编写既具有可读性又相当快速的代码。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →