RFR(L): 8161211: better inlining support for loop bytecode intrinsics
Michael Haupt
michael.haupt at oracle.com
Tue Sep 20 12:53:48 UTC 2016
Dear all,
please review this change.
Bug: https://bugs.openjdk.java.net/browse/JDK-8161211
Webrev: http://cr.openjdk.java.net/~mhaupt/8161211/webrev.00/
The method handle loop combinators introduced with JEP 274 were originally not intrinsified, leading to poor performance as compared to a pure-Java baseline, but also to handwired method handle combinations. The intrinsics introduced with 8143211 [1] improved on the situation somewhat, but still did not provide good inlining opportunities for the JIT compiler. This change introduces a usage of BoundMethodHandles as arrays to carry the various handles involved in loop execution.
Extra credits to Vladimir Ivanov, who suggested the BMH-as-arrays approach in the first place, and Claes Redestad, who suggested to use LambdaForm editing to neatly enable caching. Thanks!
Performance improves considerably. The table below reports scores in ns/op. The "unpatched" column contains results from before applying the patch for 8161211; the "patched" column, from thereafter.
The create benchmarks measure the cost of loop handle creation. The baseline and baselineMH benchmarks measure the cost of running a pure Java and handwired method handle construct.
Relevant comparisons include loop combinator results versus baselines, and versus unpatched loop combinator results. For the latter, there are significant improvements, except for the creation benchmarks (creation has a more complex workflow now). For the former, it can be seen that the BMH-array intrinsics generally perform better than handwired handle constructs, and have moved much closer to.
Thanks,
Michael
[1] https://bugs.openjdk.java.net/browse/JDK-8143211
Benchmark (iterations) unpatched patched
MethodHandlesCountedLoop.Create.create3 N/A 16039.108 18400.405
MethodHandlesCountedLoop.Create.create4 N/A 15621.959 17924.696
MethodHandlesCountedLoop.Invoke.baseline3 0 2.858 2.839
MethodHandlesCountedLoop.Invoke.baseline3 1 5.125 5.164
MethodHandlesCountedLoop.Invoke.baseline3 10 11.887 11.924
MethodHandlesCountedLoop.Invoke.baseline3 100 67.441 67.281
MethodHandlesCountedLoop.Invoke.baseline4 0 2.855 2.838
MethodHandlesCountedLoop.Invoke.baseline4 1 5.120 5.179
MethodHandlesCountedLoop.Invoke.baseline4 10 11.875 11.906
MethodHandlesCountedLoop.Invoke.baseline4 100 67.607 67.374
MethodHandlesCountedLoop.Invoke.baselineMH3 0 9.734 9.606
MethodHandlesCountedLoop.Invoke.baselineMH3 1 15.689 15.674
MethodHandlesCountedLoop.Invoke.baselineMH3 10 68.912 69.303
MethodHandlesCountedLoop.Invoke.baselineMH3 100 605.666 606.432
MethodHandlesCountedLoop.Invoke.baselineMH4 0 14.561 13.234
MethodHandlesCountedLoop.Invoke.baselineMH4 1 19.543 19.773
MethodHandlesCountedLoop.Invoke.baselineMH4 10 71.977 72.466
MethodHandlesCountedLoop.Invoke.baselineMH4 100 596.842 602.469
MethodHandlesCountedLoop.Invoke.countedLoop3 0 49.339 5.810
MethodHandlesCountedLoop.Invoke.countedLoop3 1 95.444 7.441
MethodHandlesCountedLoop.Invoke.countedLoop3 10 508.746 21.002
MethodHandlesCountedLoop.Invoke.countedLoop3 100 4701.808 145.996
MethodHandlesCountedLoop.Invoke.countedLoop4 0 49.443 5.798
MethodHandlesCountedLoop.Invoke.countedLoop4 1 98.721 7.438
MethodHandlesCountedLoop.Invoke.countedLoop4 10 503.825 21.049
MethodHandlesCountedLoop.Invoke.countedLoop4 100 4681.803 147.020
MethodHandlesDoWhileLoop.Create.create N/A 7628.312 9100.332
MethodHandlesDoWhileLoop.Invoke.baseline 1 3.868 3.909
MethodHandlesDoWhileLoop.Invoke.baseline 10 16.480 16.461
MethodHandlesDoWhileLoop.Invoke.baseline 100 144.260 144.232
MethodHandlesDoWhileLoop.Invoke.baselineMH 1 14.434 14.494
MethodHandlesDoWhileLoop.Invoke.baselineMH 10 92.542 93.454
MethodHandlesDoWhileLoop.Invoke.baselineMH 100 877.480 880.496
MethodHandlesDoWhileLoop.Invoke.doWhileLoop 1 26.791 7.153
MethodHandlesDoWhileLoop.Invoke.doWhileLoop 10 158.985 16.990
MethodHandlesDoWhileLoop.Invoke.doWhileLoop 100 1391.746 130.946
MethodHandlesIteratedLoop.Create.create N/A 13547.499 15478.542
MethodHandlesIteratedLoop.Invoke.baseline 0 2.973 2.980
MethodHandlesIteratedLoop.Invoke.baseline 1 6.771 6.658
MethodHandlesIteratedLoop.Invoke.baseline 10 14.955 14.955
MethodHandlesIteratedLoop.Invoke.baseline 100 81.842 82.582
MethodHandlesIteratedLoop.Invoke.baselineMH 0 14.893 14.668
MethodHandlesIteratedLoop.Invoke.baselineMH 1 20.998 21.304
MethodHandlesIteratedLoop.Invoke.baselineMH 10 73.677 72.703
MethodHandlesIteratedLoop.Invoke.baselineMH 100 613.913 614.475
MethodHandlesIteratedLoop.Invoke.iteratedLoop 0 33.583 9.603
MethodHandlesIteratedLoop.Invoke.iteratedLoop 1 82.239 14.433
MethodHandlesIteratedLoop.Invoke.iteratedLoop 10 448.356 38.650
MethodHandlesIteratedLoop.Invoke.iteratedLoop 100 4189.034 279.779
MethodHandlesLoop.Create.create N/A 15505.970 17559.399
MethodHandlesLoop.Invoke0.baseline 1 3.179 3.181
MethodHandlesLoop.Invoke0.baseline 10 5.952 6.115
MethodHandlesLoop.Invoke0.baseline 100 50.942 50.943
MethodHandlesLoop.Invoke0.loop 1 46.454 5.353
MethodHandlesLoop.Invoke0.loop 10 514.230 8.487
MethodHandlesLoop.Invoke0.loop 100 5166.251 52.188
MethodHandlesLoop.Invoke1.loop 1 34.321 5.277
MethodHandlesLoop.Invoke1.loop 10 430.839 8.481
MethodHandlesLoop.Invoke1.loop 100 4095.302 52.206
MethodHandlesTryFinally.baselineExceptional N/A 3.005 3.002
MethodHandlesTryFinally.baselineMHExceptional N/A 166.316 166.087
MethodHandlesTryFinally.baselineMHNormal N/A 9.337 9.276
MethodHandlesTryFinally.baselineNormal N/A 2.696 2.683
MethodHandlesTryFinally.create N/A 406.255 406.594
MethodHandlesTryFinally.invokeTryFinallyExceptional N/A 154.121 154.692
MethodHandlesTryFinally.invokeTryFinallyNormal N/A 5.350 5.334
MethodHandlesWhileLoop.Create.create N/A 12214.383 14503.515
MethodHandlesWhileLoop.Invoke.baseline 0 3.886 3.888
MethodHandlesWhileLoop.Invoke.baseline 1 5.379 5.377
MethodHandlesWhileLoop.Invoke.baseline 10 16.000 16.201
MethodHandlesWhileLoop.Invoke.baseline 100 142.066 143.338
MethodHandlesWhileLoop.Invoke.baselineMH 0 11.028 11.012
MethodHandlesWhileLoop.Invoke.baselineMH 1 21.269 21.159
MethodHandlesWhileLoop.Invoke.baselineMH 10 97.493 97.656
MethodHandlesWhileLoop.Invoke.baselineMH 100 887.579 886.532
MethodHandlesWhileLoop.Invoke.whileLoop 0 24.829 7.108
MethodHandlesWhileLoop.Invoke.whileLoop 1 46.039 8.573
MethodHandlesWhileLoop.Invoke.whileLoop 10 240.963 21.088
MethodHandlesWhileLoop.Invoke.whileLoop 100 2092.671 159.016
--
<http://www.oracle.com/>
Dr. Michael Haupt | Principal Member of Technical Staff
Phone: +49 331 200 7277 | Fax: +49 331 200 7561
Oracle Java Platform Group | LangTools Team | Nashorn
Oracle Deutschland B.V. & Co. KG | Schiffbauergasse 14 | 14467 Potsdam, Germany
ORACLE Deutschland B.V. & Co. KG | Hauptverwaltung: Riesstraße 25, D-80992 München
Registergericht: Amtsgericht München, HRA 95603
Komplementärin: ORACLE Deutschland Verwaltung B.V. | Hertogswetering 163/167, 3543 AS Utrecht, Niederlande
Handelsregister der Handelskammer Midden-Nederland, Nr. 30143697
Geschäftsführer: Alexander van der Ven, Jan Schultheiss, Val Maher
<http://www.oracle.com/commitment> Oracle is committed to developing practices and products that help protect the environment
More information about the core-libs-dev
mailing list