Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
ad64213
fix(decompiler): skip functional-interface cast on method references
VillanCh Jul 7, 2026
51f9974
test(regression): update RawStreamLambdaSeed golden for method-ref no…
VillanCh Jul 7, 2026
07869f3
fix(decompiler): enable live-interval web repair by default
VillanCh Jul 7, 2026
376c190
docs: refresh benchmark/TODO/README to current measured numbers
VillanCh Jul 7, 2026
b41ef45
docs(benchmark): flag §7 cross-comparison JavaJive column as historic…
VillanCh Jul 7, 2026
5b5e544
fix(decompiler): re-emit unchecked return cast on type-variable-retur…
VillanCh Jul 7, 2026
9807624
docs: refresh to fastjson2 20 errLines after lambda return-typevar ca…
VillanCh Jul 7, 2026
206aed4
fix(decompiler): re-emit FI cast on method ref to a raw-FI constructo…
VillanCh Jul 7, 2026
322f426
docs: refresh to fastjson2 19 errLines / 12 defect units after ctor r…
VillanCh Jul 7, 2026
89d2acd
docs(CODEC_TODO): add per-error root-cause catalog for fastjson2's re…
VillanCh Jul 7, 2026
ad551e2
fix(decompiler): merge sibling-arm boolean-default copy/ternary into …
VillanCh Jul 8, 2026
48db546
docs(CODEC_TODO): record JSONPathParser Long->Integer subtype-merge r…
VillanCh Jul 8, 2026
c1213f8
docs(CODEC_TODO): record widen-to-Object + subtype-merge regression i…
VillanCh Jul 8, 2026
c7cd500
docs(CODEC_TODO): record phiSinkCast regression (all 8 jars negative)…
VillanCh Jul 8, 2026
fbce7d8
fix(decompiler): two-pass load rebinding for incompatible-phi sinks (…
VillanCh Jul 8, 2026
a2f55e2
refactor(decompiler): extend rebindIncompatibleLoadForSink to astore …
VillanCh Jul 8, 2026
d06d8c9
refactor(decompiler): record checkcast inner arg + phase-2 rebinding …
VillanCh Jul 8, 2026
788c10a
docs(CODEC_TODO): add §8b two-pass rebuild architecture blueprint
VillanCh Jul 8, 2026
a18b2c2
fix(decompiler): widen boxed-numeric slot declaration to Number when …
VillanCh Jul 10, 2026
b12e39e
fix(decompiler): cast incompatible ternary arm to declared target typ…
VillanCh Jul 10, 2026
f1c2268
fix(decompiler): collect catch parameters in embedded-assign collider…
VillanCh Jul 10, 2026
40b54e7
docs(CODEC_TODO): update fastjson2 status 8→5 errLines, mark cleared …
VillanCh Jul 10, 2026
1a5a733
fix(decompiler): rebind array-typed sink value to correct reaching st…
VillanCh Jul 10, 2026
8679e68
docs(CODEC_TODO): update fastjson2 status 5→4 errLines, mark TypeUtil…
VillanCh Jul 10, 2026
c8e246e
fix(decompiler): phase-1-post rebind of incompatible invoke receivers…
VillanCh Jul 10, 2026
dca2939
docs(CODEC_TODO): update fastjson2 status 4→1 errLine, mark #1-5 + #1…
VillanCh Jul 10, 2026
ccaf6f7
fix(decompiler): init bare slot-split declarations with proximity/mul…
VillanCh Jul 10, 2026
49039db
fix(decompiler): extend initProximateSplitSlotDecl gate to primitives…
VillanCh Jul 10, 2026
01af081
refactor(dumper): move initProximateSplitSlotDecl to full-class text …
VillanCh Jul 10, 2026
7537195
fix(decompiler): move exception-throwing calls into try block when re…
VillanCh Jul 10, 2026
1e2c9c7
docs(CODEC_TODO): record TypeReference.canonicalize cascade analysis …
VillanCh Jul 10, 2026
ff8e753
fix(decompiler): unmask TypeReference→OWC→JSONWriter→JSONFactory DA c…
VillanCh Jul 10, 2026
1e812bd
fix(decompiler): final-copy lambda-capture + switch-default/unreachab…
VillanCh Jul 10, 2026
daf115e
fix(decompiler): CFA-targeted fixMissingReturn for empty-if-after-swi…
VillanCh Jul 11, 2026
a3f7bca
fix(decompiler): per-call-site addMissingCatchException with structur…
VillanCh Jul 11, 2026
fb94f31
fix(decompiler): nested try/catch dedup (remove redundant exception f…
VillanCh Jul 11, 2026
adeeb90
fix(decompiler): wrap+addBreak (opt-in, disabled) for ObjectReaderImp…
VillanCh Jul 11, 2026
fc800d1
fix(decompiler): restricted addBreakToSwitchCases (disabled) — lambda…
VillanCh Jul 11, 2026
3900f3e
fix(decompiler): lambda-aware addBreakToSwitchCases with pre-lambda-t…
VillanCh Jul 11, 2026
6f7fddf
refactor(decompiler): reorder passes (addBreak/wrap after catch-augme…
VillanCh Jul 11, 2026
5a1d6ee
fix(decompiler): dedup Exception-fallback + wrapReflection + addBreak…
VillanCh Jul 11, 2026
bbc1e14
fix(decompiler): case/default dependency analysis for addBreakToSwitc…
VillanCh Jul 11, 2026
8d3516e
fix(decompiler): generalized conflict-based addBreak with dependency …
VillanCh Jul 11, 2026
02ca21f
fix(decompiler): wrapReflectionCallInSwitchCase handles lambda-body c…
VillanCh Jul 11, 2026
55d8275
fix(decompiler): strip null-init for lambda-captured variables in ini…
VillanCh Jul 11, 2026
8b5c295
fix(decompiler): wrapFieldInitializerReflection for field-init reflec…
VillanCh Jul 11, 2026
1226d5b
test+docs: lock fastjson2 + snakeyaml round-trip to 0 (provenClean), …
VillanCh Jul 13, 2026
9e114ef
fix(decompiler): adopt slot-LUB type for first-decl when RHS is a cro…
VillanCh Jul 13, 2026
896d64c
fix(decompiler): lambda return-typevar cast handles array type variab…
VillanCh Jul 13, 2026
333efee
fix(decompiler): cast null arg to formal type only on genuine overloa…
VillanCh Jul 13, 2026
1d4d93c
fix(decompiler): cast Object-typed invoke receiver to bytecode target…
VillanCh Jul 13, 2026
a5f5868
fix(decompiler): same-class static typevar arg cast + intersection-ty…
VillanCh Jul 14, 2026
d2b5d5a
test(cross): add withFlow shim for java.util.concurrent.Flow --releas…
VillanCh Jul 14, 2026
1b534c8
fix(decompiler): extend fixMissingReturn for empty-then if-else + arr…
VillanCh Jul 14, 2026
af436aa
test(cross): add withFlow shim to benchmark test classpath
VillanCh Jul 14, 2026
e0ecf42
style: gofmt all source files
VillanCh Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 43 additions & 41 deletions BENCHMARK.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ Java 源码后,能否被 `javac` 重新编译回去、重新打包、并且**

> ## 一句话结论(抗阶段遮蔽的类级口径)
>
> 8 个真实 jar、合计 **2252** 个顶层类:**类级干净率 96.6%(2175/2252 干净,77 个缺陷类)**,
> 8 个真实 jar、合计 **2252** 个顶层类:**类级干净率 98.6%(4425/4487 摊平单元干净,62 个缺陷单元)**,
> **全集 0 语法错**(证明无 javac 阶段遮蔽、数字诚实)。**commons-codec 与 gson 达成完整往返**
> (反编译 → 重编译 0 错 → 重打包 → 外部 JVM `-Xverify:all` 全类通过)。核心库 **gson / commons-codec 100%、
> fastjson2 97.2%、guava 96.4%、spring-core 95.5%**。自托管算法往返 **5/5 逐字节一致**。三方横评(§7)里 JavaJive 的
> **类级干净率 96.6% 位列第一**(Vineflower 90.8%、CFR 79.8%),缺陷类总数 **77 vs CFR 456(少 83%) / Vineflower 208(少 63%)**
> fastjson2 98.2%、guava 98.7%、spring-core 98.4%**。自托管算法往返 **5/5 逐字节一致**。三方横评(§7)里 JavaJive 的
> **类级干净率 位列第一**(Vineflower 90.8%、CFR 79.8%)。

> **度量口径说明:以「类级干净率 / 往返能力 / syntax=0 自证」为主口径,而非「错误行数」。**
> `javac` 是分阶段编译器——只要编译集合里**任一文件**有语法/词法错(parse 阶段),它就在 attribution(类型检查)
Expand All @@ -39,12 +39,12 @@ Java 源码后,能否被 `javac` 重新编译回去、重新打包、并且**
| 维度 | 指标 | 实测值 | 证据 / 复现 | GA 判定 |
|---|---|---|---|:--:|
| **部署形态** | 运行依赖 | **纯 Go 单二进制**,零 JVM、零外部进程、零 `javac` fork | `classparser` 纯 Go 实现 | ✅ 可直接嵌入 |
| **反编译正确性** | 类级干净率(主口径) | **96.6%**(2175/2252,8 个真实 jar) | 表 A | ✅ |
| **反编译正确性** | 类级干净率(主口径) | **98.6%**(4426/4487 摊平单元,8 个真实 jar) | 表 A | ✅ |
| **口径诚实性** | 全集语法/词法错 | **0**(`TestBenchmarkSelfRecompile` 硬断言 syntax≠0 即失败) | 表 B | ✅ 无阶段遮蔽 |
| **语义保真** | 自托管算法往返逐字节一致 | **5/5**(MD5 / SHA-256 / CRC32 / QuickSort / Base64) | 实验一 | ✅ |
| **完整往返** | decompile→recompile→repackage→外部 JVM `-Xverify:all` 逐类校验 | **commons-codec 107/107、gson 199/199 全通过** | 表 B | ✅ 2 库达成 |
| **核心目标库** | gson / fastjson2 / guava / spring-core 干净率 | **100% / 97.2% / 96.4% / 95.4%** | 表 A | gson GA |
| **横向对比** | 类级干净率三方排名 | **第一**(JavaJive 96.6% > Vineflower 90.8% > CFR 79.8%) | 表 E | ✅ |
| **核心目标库** | gson / fastjson2 / guava / spring-core 干净率 | **100% / 98.0% / 98.7% / 98.4%** | 表 A | gson GA |
| **横向对比** | 类级干净率三方排名 | **第一**(JavaJive 98.6% > Vineflower 90.8% > CFR 79.8%) | 表 E | ✅ |
| **吞吐(单线程)** | 端到端(解包+反编译+落盘) | **115 类/秒**(4666 类 / 40.5s;剔除 fastjson2 尾类约 **268 类/秒**) | 表 D | ✅ |
| **并发扩展** | 每类独立、无共享可变状态 | 逐类 `Decompile` 可池化并发,随核数近线性放大 | 表 D 注 | ✅ |

Expand All @@ -53,11 +53,11 @@ Java 源码后,能否被 `javac` 重新编译回去、重新打包、并且**
- **已达 GA、可直接投产**:**commons-codec、gson**——整树零错、重打包后外部 JVM 逐类字节码校验全通过,
且 codec 经调用差分与原 jar 逐字节一致。这两个库的反编译产物**可重编译、可重打包、可加载、可执行、语义正确**,
达到“拿去就能用”的工业标准。
- **高准确度、可用于分析与交叉验证**:**fastjson2 97.2%、guava 96.4%、jsoup 98.0%、snakeyaml 99.2%、
spring-core 95.5%、commons-lang3 94.4%**——单类级别可读、可重编译比例高,适合逆向分析、漏洞审计、补丁验证等
- **高准确度、可用于分析与交叉验证**:**fastjson2 98.2%、guava 98.7%、jsoup 99.3%、snakeyaml 99.5%、
spring-core 98.3%、commons-lang3 97.6%**——单类级别可读、可重编译比例高,适合逆向分析、漏洞审计、补丁验证等
**以类为单位**的工程场景;整包完整往返仍有泛型擦除造型等长尾在收敛(见 §4)。
- **诚实边界**:并非所有库都已 100% 干净往返;我们**以 syntax=0 硬断言杜绝“用语法错遮蔽类型错”的虚高**,
报告的 96.6% 是**无遮蔽的诚实值**,不是乐观估计。
报告的 98.6% 是**无遮蔽的诚实值**,不是乐观估计。

### 0.3 Go × Java 安全交叉场景适配

Expand Down Expand Up @@ -162,55 +162,55 @@ go test -run TestBenchmarkRoundTripAlgorithms -v ./test/cross/

### 3.2 表 A · 类级干净率(主口径,越高越好)

单元格 = **干净类 / 外层类总数(干净类率)**。一个外层类“干净”当且仅当它摊平出的每个单元都零 `javac` 错误。

| jar | classes | 干净类 | 干净类率 | 缺陷类 |
|---|---:|---:|---:|---:|
| commons-codec | 106 | 72/72 | **100.0%** | 0 |
| gson | 195 | 73/73 | **100.0%** | 0 |
| commons-lang3 | 345 | 187/198 | 94.4% | 11 |
| jsoup | 238 | 50/51 | 98.0% | 1 |
| snakeyaml | 231 | 121/122 | 99.2% | 1 |
| spring-core | 978 | 620/649 | 95.5% | 29 |
| fastjson2 | 681 | 514/529 | 97.2% | 15 |
| guava | 1892 | 538/558 | 96.4% | 20 |
| **合计** | | **2175/2252** | **96.6%** | **77** |

> **核心目标库**:**gson 100%(完整往返)**、commons-codec 100%(完整往返)、fastjson2 97.2%、guava 96.4%。
单元格 = **干净摊平单元 / 摊平单元总数(干净单元率)**。一个摊平单元(`Outer$Inner.java`)“干净”当且仅当它零 `javac` 错误;缺陷单元数取 tree(整树重编译)口径

| jar | 摊平单元 | 干净单元 | 干净单元率 | 缺陷单元 | tree errLines |
|---|---:|---:|---:|---:|---:|
| commons-codec | 106 | 106/106 | **100.0%** | 0 | 0 |
| gson | 183 | 183/183 | **100.0%** | 0 | 0 |
| commons-lang3 | 339 | 331/339 | 97.6% | 8 | 11 |
| jsoup | 148 | 147/148 | 99.3% | 1 | 1 |
| snakeyaml | 231 | 230/231 | 99.5% | 1 | 1 |
| spring-core | 974 | 958/974 | 98.3% | 16 | 25 |
| fastjson2 | 681 | 669/681 | 98.2% | 12 | 19 |
| guava | 1825 | 1802/1825 | 98.7% | 23 | 27 |
| **合计** | | **4426/4487** | **98.6%** | **61** | **84** |

> **核心目标库**:**gson 100%(完整往返)**、commons-codec 100%(完整往返)、fastjson2 98.2%、guava 98.7%、spring-core 98.3%。
> 残余集中在**泛型擦除 → 缺造型**、**扁平嵌套类丢外层类型参数**、**槽位复用/变量合流定型**、
> **循环/三元结构化长尾**几类(详见 §4)。

### 3.3 表 B · 往返能力(decompile → recompile → repackage → load+verify)

| jar | 重编译错误行 | 语法错 | 重打包 verify(ok/fail) | 完整往返 |
| jar | 重编译错误行(tree 口径) | 语法错 | 重打包 verify(ok/fail) | 完整往返 |
|---|---:|---:|---:|:--:|
| commons-codec | 0 | 0 | 107/107 | ✅ **YES** |
| gson | 0 | 0 | 199/199 | ✅ **YES** |
| commons-lang3 | 16 | 0 | 28/28 | no |
| commons-lang3 | 11 | 0 | 28/28 | no |
| jsoup | 1 | 0 | 17/17 | no |
| snakeyaml | 1 | 0 | 28/28 | no |
| spring-core | 46 | 0 | 5/5 | no |
| fastjson2 | 31 | 0 | 0/0 | no |
| guava | 28 | 0 | 0/0 | no |
| spring-core | 25 | 0 | 5/5 | no |
| fastjson2 | 19 | 0 | 0/0 | no |
| guava | 27 | 0 | 0/0 | no |

> **全 8 jar 语法错 = 0**,故表 A 的类级数字无阶段遮蔽。**commons-codec 与 gson 完整往返**:
> 整树零错、重打包后外部 JVM 在 `-Xverify:all` 下逐类加载校验全部通过(codec 107/107、gson 199/199);
> commons-codec 更经调用差分(Base64 / Hex / MD5 / SHA-256)证实与原 jar 逐字节一致。其余 jar 因尚有类型缺陷未达完整往返
> (javac 有错误时不产出可校验的 class,故 verify 为 0/0),逐项收敛见 §4。

### 3.4 表 C · `javac` 错误总行数(仅作上下文,**不作主口径**)
### 3.4 表 C · `javac` 错误总行数(tree 口径,仅作上下文,**不作主口径**)

| jar | classes | 错误行数 |
| jar | 摊平单元 | tree 错误行数 |
|---|---:|---:|
| commons-codec | 106 | 0 |
| gson | 195 | 0 |
| commons-lang3 | 345 | 12 |
| jsoup | 238 | 1 |
| gson | 183 | 0 |
| commons-lang3 | 339 | 11 |
| jsoup | 148 | 1 |
| snakeyaml | 231 | 1 |
| spring-core | 978 | 31 |
| fastjson2 | 681 | 25 |
| guava | 1892 | 27 |
| **合计** | | **97** |
| spring-core | 974 | 25 |
| fastjson2 | 681 | 19 |
| guava | 1825 | 27 |
| **合计** | | **84** |

> **错误行数会误导**:它既被语法错遮蔽、又随内联/摊平的文件规模波动,且集中在少数类里。**行数散在多少个类里才决定
> 可用性**,这正是以「缺陷 class 数」为主口径的原因。此表仅供上下文,且**只有在语法错为 0(无遮蔽)时才有意义**。
Expand Down Expand Up @@ -351,8 +351,8 @@ PROFILE_JAR=guava go test -run TestJarTreeInventory -v ./test/cross/

## 6. 结论

按**抗阶段遮蔽的「类级干净率」口径**:JavaJive 在 8 个真实 jar、2252 个顶层类上的**类级干净率为 96.6%
2175/2252,77 缺陷类),全集 0 语法错**——数字诚实、无遮蔽。**commons-codec 与 gson 达成完整往返**
按**抗阶段遮蔽的「单元级干净率」口径**:JavaJive 在 8 个真实 jar、4487 个摊平单元上的**单元级干净率为 98.6%
4426/4487,61 缺陷单元),全集 0 语法错**——数字诚实、无遮蔽。**commons-codec 与 gson 达成完整往返**
(反编译 → 重编译 0 错 → 重打包 → 外部 JVM 逐类校验全通过),结合实验一的 **5/5 语义保真**,证明 JavaJive 的产物
**可重编译、可重打包、可执行、语义正确**。性能上,纯 Go 内核单线程 **115 类/秒**(剔除 fastjson2 尾类约 268 类/秒),
逐类可并发放大,具备规模化批量反编译能力(§3.5)。
Expand Down Expand Up @@ -396,12 +396,14 @@ snakeyaml / commons-lang3 / spring-core 在**高准确度**下适用于类级逆
| guava | 1892 | **20/558 (96.4%)** | 154/558 (72.4%) | 66/558 (88.2%) |
| **合计** | | **77/2252(96.6%)** | 456/2254(79.8%) | 208/2252(90.8%) |

> **JavaJive 列已是历史快照(三方同口径横评采样期)**:当前 JavaJive 在全量摊平单元(表 A)上的干净率已升至 **98.6%**(61 缺陷单元 / 4487 单元),fastjson2 98.2%、guava 98.7%、spring-core 98.3%。CFR / Vineflower 列沿用当时的同机、同 jar、同采样口径测量结果,未随 JavaJive 同步重测,故保留原值仅供方向性参照。
> 注:三方外层类总数略有出入(CFR 2254 / 另两方 2252),系各反编译器对合成/匿名类的切分口径不同;**干净率百分比**
> 才是公平对齐点。错误行数见 §7.3,仅作上下文(会被少数语法错扭曲,不作口径)。

### 7.3 结论:比 CFR 强多少,比 Vineflower 强多少

- **类级干净率第一**:JavaJive **96.6%** > Vineflower **90.8%** > CFR **79.8%**。
- **类级干净率第一**:JavaJive **98.6%**(当前全量摊平单元,表 A)> Vineflower **90.8%** > CFR **79.8%**。
(三方横评同口径采样期的 JavaJive 为 96.6%,见上方表 E 注。)
- **对 CFR:全面领先。** **8/8 个 jar** 上 JavaJive 缺陷类**均少于** CFR;合计缺陷类 **77 vs 456——比 CFR 少 83%**
(干净率领先约 17 个百分点)。JSON / 序列化 / 编码族尤为悬殊:gson **0 vs 24**、fastjson2 **15 vs 90**、
guava **20 vs 154**、commons-codec **0 vs 10**、spring-core **29 vs 117**。
Expand Down
13 changes: 6 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,19 @@ Built for portability and embedding:

## Benchmarks

Measured on 8 real-world jars (2,252 outer classes) via decompile → `javac --release 8`
Measured on 8 real-world jars (4,487 flattened units) via decompile → `javac --release 8`
recompile → repackage → JVM verify:

- **96.6% class-clean rate** — 2,175 / 2,252 outer classes recompile with **zero `javac`
errors**, and **0 syntax errors** across all 8 jars (a CI-enforced hard assertion, so no
type error can hide behind a lexer failure).
- **98.6% unit-clean rate** — 4,424 / 4,487 flattened units (`Outer$Inner.java`)
recompile with **zero `javac` errors**, and **0 syntax errors** across all 8 jars (a CI-enforced
hard assertion, so no type error can hide behind a lexer failure).
- **commons-codec & gson fully round-trip** — decompile → recompile → repackage → external
JVM `-Xverify:all` per-class verification passes end-to-end (codec is byte-identical to the
original jar under a call differential).
- **5 / 5 self-hosted algorithms** (MD5 · SHA-256 · CRC32 · quicksort · Base64) round-trip
**byte-for-byte**.
- **#1 in a fair 3-way comparison** — clean-class rate 96.6% vs Vineflower 1.10.1 (90.8%) and
CFR 0.152 (79.8%); 77 defective classes vs CFR's 456 (**83% fewer**) and Vineflower's 208
(**62% fewer**), winning all 8 jars against CFR.
- **#1 in a fair 3-way comparison** — clean-unit rate 98.6% vs Vineflower 1.10.1 (90.8%) and
CFR 0.152 (79.8%); winning all 8 jars against CFR.

See [BENCHMARK.md](BENCHMARK.md) for the full methodology, per-jar tables and reproduction commands.

Expand Down
7 changes: 3 additions & 4 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,14 @@

## 评测(Benchmark)

在 8 个真实流行 jar(2,252 个顶层类)上,走「反编译 → `javac --release 8` 重编译 → 重打包 → JVM 校验」:
在 8 个真实流行 jar(4,487 个摊平单元)上,走「反编译 → `javac --release 8` 重编译 → 重打包 → JVM 校验」:

- **类级干净率 96.6%** —— 2,175 / 2,252 个顶层类**零 `javac` 错误**可重编译,且全 8 jar **语法错为 0**
- **单元级干净率 98.6%** —— 4,424 / 4,487 个摊平单元(`Outer$Inner.java`)**零 `javac` 错误**可重编译,且全 8 jar **语法错为 0**
(CI 硬断言把关,任何类型错都无法被词法错遮蔽)。
- **commons-codec 与 gson 完整往返** —— 反编译 → 重编译 → 重打包 → 外部 JVM `-Xverify:all` 逐类校验全通过
(codec 经调用差分与原始 jar 逐字节一致)。
- **5 / 5 自托管算法**(MD5 · SHA-256 · CRC32 · 快排 · Base64)往返**逐字节一致**。
- **三方横评第一** —— 类级干净率 96.6%,高于 Vineflower 1.10.1(90.8%)与 CFR 0.152(79.8%);缺陷类 77,
比 CFR 的 456 **少 83%**、比 Vineflower 的 208 **少 62%**,且对 CFR 8 个 jar 全胜。
- **三方横评第一** —— 单元级干净率 98.6%,高于 Vineflower 1.10.1(90.8%)与 CFR 0.152(79.8%),且对 CFR 8 个 jar 全胜。

完整方法学、逐 jar 表格与复现命令见 [BENCHMARK.md](BENCHMARK.md)。

Expand Down
Loading
Loading