Skip to content

WIP: Make ClassWriter reusable

Jason Zaugg requested to merge retronymm/asm:topic/buffer-reuse into master

Adds a clear() method to ClassWriter to allow the user to reuse it to write another class without needing to allocate new buffers for the constant pool, etc.

Furthermore, add a mode that enabled internal reuse of of buffers class writing.

Exposes an overload of toByteArray that does not require a copy of the internal buffer, but rather returns the ByteVector directly. ByteVector has been updated to expose its contents in a read-only manner as a ByteBuffer or a ByteArrayInputStream.

I've made an initial attempt to include this in the benchmark framework.

 # VM version: JDK 1.8.0_162, VM 25.162-b12
Benchmark                                                          Mode  Cnt        Score       Error   Units
GeneratorBenchmark.asm6_1                                         thrpt   20   874896.336 ± 10360.316   ops/s
GeneratorBenchmark.asm6_1:+memory.used                            thrpt   20          ≈ 0               bytes
GeneratorBenchmark.asm6_1:·gc.alloc.rate                          thrpt   20     2777.524 ±    31.962  MB/sec
GeneratorBenchmark.asm6_1:·gc.alloc.rate.norm                     thrpt   20     5000.001 ±     0.003    B/op
GeneratorBenchmark.asm6_1:·gc.churn.PS_Eden_Space                 thrpt   20     2689.738 ±    71.334  MB/sec
GeneratorBenchmark.asm6_1:·gc.churn.PS_Eden_Space.norm            thrpt   20     4841.558 ±   101.258    B/op
GeneratorBenchmark.asm6_1:·gc.churn.PS_Survivor_Space             thrpt   20        0.162 ±     0.044  MB/sec
GeneratorBenchmark.asm6_1:·gc.churn.PS_Survivor_Space.norm        thrpt   20        0.291 ±     0.079    B/op
GeneratorBenchmark.asm6_1:·gc.count                               thrpt   20      264.000              counts
GeneratorBenchmark.asm6_1:·gc.time                                thrpt   20      176.000                  ms
GeneratorBenchmark.asm6_1_reuse                                   thrpt   20  1053280.540 ± 38925.306   ops/s
GeneratorBenchmark.asm6_1_reuse:+memory.used                      thrpt   20          ≈ 0               bytes
GeneratorBenchmark.asm6_1_reuse:·gc.alloc.rate                    thrpt   20     1525.059 ±    56.375  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.alloc.rate.norm               thrpt   20     2280.001 ±     0.002    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.churn.PS_Eden_Space           thrpt   20     1455.204 ±    57.245  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.churn.PS_Eden_Space.norm      thrpt   20     2175.987 ±    47.373    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.churn.PS_Survivor_Space       thrpt   20        0.171 ±     0.046  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.churn.PS_Survivor_Space.norm  thrpt   20        0.257 ±     0.070    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.count                         thrpt   20      248.000              counts
GeneratorBenchmark.asm6_1_reuse:·gc.time                          thrpt   20      166.000                  ms
 # VM version: JDK 10.0.1, VM 10.0.1+10
Benchmark                                                                         Mode  Cnt       Score      Error   Units
GeneratorBenchmark.asm6_1                                                        thrpt   20  808490.379 ± 9597.741   ops/s
GeneratorBenchmark.asm6_1:·gc.alloc.rate                                         thrpt   20    2567.604 ±   30.110  MB/sec
GeneratorBenchmark.asm6_1:·gc.alloc.rate.norm                                    thrpt   20    5000.001 ±    0.002    B/op
GeneratorBenchmark.asm6_1:·gc.churn.CodeHeap_'non-profiled_nmethods'             thrpt   20       0.008 ±    0.002  MB/sec
GeneratorBenchmark.asm6_1:·gc.churn.CodeHeap_'non-profiled_nmethods'.norm        thrpt   20       0.016 ±    0.004    B/op
GeneratorBenchmark.asm6_1:·gc.churn.G1_Old_Gen                                   thrpt   20    2574.135 ±   84.224  MB/sec
GeneratorBenchmark.asm6_1:·gc.churn.G1_Old_Gen.norm                              thrpt   20    5012.769 ±  155.361    B/op
GeneratorBenchmark.asm6_1:·gc.count                                              thrpt   20     235.000             counts
GeneratorBenchmark.asm6_1:·gc.time                                               thrpt   20     250.000                 ms
GeneratorBenchmark.asm6_1_reuse                                                  thrpt   20  874917.363 ± 2517.632   ops/s
GeneratorBenchmark.asm6_1_reuse:·gc.alloc.rate                                   thrpt   20    1266.731 ±    4.102  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.alloc.rate.norm                              thrpt   20    2280.001 ±    0.002    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.churn.CodeHeap_'non-profiled_nmethods'       thrpt   20       0.004 ±    0.002  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.churn.CodeHeap_'non-profiled_nmethods'.norm  thrpt   20       0.008 ±    0.004    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.churn.G1_Old_Gen                             thrpt   20    1266.407 ±   62.495  MB/sec
GeneratorBenchmark.asm6_1_reuse:·gc.churn.G1_Old_Gen.norm                        thrpt   20    2279.504 ±  113.687    B/op
GeneratorBenchmark.asm6_1_reuse:·gc.count                                        thrpt   20     144.000             counts
GeneratorBenchmark.asm6_1_reuse:·gc.time                                         thrpt   20     147.000                 ms

Merge request reports