objectionary/soap26-paper
GitHub: objectionary/soap26-paper
该仓库包含一篇探讨如何利用 φ-calculus 重写规则将 Java Stream API 中的连续操作融合为 mapMulti() 调用从而实现性能优化的学术论文及其全部可复现实验工件。
Stars: 4 | Forks: 0
# 通过 𝜑-Calculus 实现 Java Stream Fusion (LaTeX 论文)
[](https://github.com/objectionary/soap26-paper/blob/master/LICENSE.txt)
[](https://doi.org/10.5281/zenodo.19837769)
[](https://github.com/objectionary/soap26-paper/actions/workflows/make.yml)
此仓库包含实验工件
以及 LaTeX 格式的研究论文。
本研究探讨了一种针对 [Java Stream API] 的 bytecode 到 bytecode 优化技术,
该技术将连续的 `map()` 和 `filter()` 操作替换为单次 `mapMulti()` 调用
(该方法在 Java 16 中引入)。
该优化是通过 [φ-calculus] 重写规则以声明式的方式实现的,
而不是通过命令式的 bytecode 操作。
在 [Biboudis et al.] 提出并被 [Møller et al.] 使用的九个基准测试上进行的实验表明,
该转换保留了所有程序行为,并且没有引起性能衰退;
在部分情况下,它还缩短了执行时间。
此仓库中的所有工具、基准测试和数据
均可复现论文中报告的结果。
本研究使用了以下开源工具:
* [Streamliner] 用于将 stream pipeline 展开为循环
* [hone-maven-plugin] 用于使用 [φ-calculus] 重写规则融合 stream 操作
* [Phino] 用于重写 [φ-calculus] 表达式
* [jeo-maven-plugin] 用于将 bytecode 转换为 [φ-calculus] 并转回
* [JMH] 用于基准测试
为了复现实验并编译论文,
你需要运行:
```
git clone --recurse-submodules https://github.com/objectionary/soap26-paper.git
make REPEAT=2 NUMBERS=15
```
如果出现问题,请检查 `log.txt` 文件。
你可以提供以下变量:
* `REPEAT=5` 请求进行五次重复测试运行
(推荐:10)
* `NUMBERS=7` 使我们的测试在测试数组中使用七百万个数字
(推荐:100)
* `VENDORS=3` 使我们的测试使用不超过三个 JVM 供应商
(推荐:10)
* `ITERATIONS=3` 请求 JMH 进行三次测量迭代
(推荐:10)
* `WARMUPS=2` 请求 JMH 进行两次预热迭代
(推荐:10)
默认情况下,所有这些参数都被设置为其最小值。
运行 `make clean ultimate` 以使用所有推荐值。
## 前置条件
你需要安装以下组件:
* [GNU Make] 4+
* [Docker](即使你使用 `make` 运行它,而不是 `docker`)
* 包含宏包的 LaTeX(完整列表请参见 [DEPENDS.txt](/DEPENDS.txt))
* [Poppler]
* [SdkMan]
* Ruby 3.3+
* [GNU Bash] 5+(不是默认安装的 bash!)
* [GNU coreutils],特别是 `print`、`awk`、`sed`、`grep` 和 `find`
* [Vale]
* [GNU Aspell]
* [texsc]
* [texqc]
不支持在 Windows 上进行构建。
你需要使用 Ubuntu 或 macOS。
## Docker
你可以运行所有实验,然后使用 Docker 渲染论文。
但是,基准测试的准确性可能会降低。
像这样运行它:
```
make docker REPEAT=2 NUMBERS=15
```
完成后,你将在当前目录中获得构建好的 `paper.pdf`。
不支持 `make docker ultimate` 命令。
相反,请手动指定所有参数
及其推荐值。
## 仓库结构
子目录包含:
* `tex/` 包含论文的各个章节,格式为 TeX。
* `tables/` 包含一些带有独立 Make 项目的目录,
这些项目运行基准测试并收集结果,以生成 TeX 表格。
* `tikz/` 包含论文的 TikZ 图表。
* `streamliner/` 包含 [Streamliner] 源代码,不包含测试以及
与本次实验无关的其他一些文件。
标签:JS文件枚举, TruffleHog, φ演算, 域名枚举, 学术论文, 性能基准测试, 流融合, 编译器优化, 请求拦截