On Thu, 21 Nov 2024 03:28:29 GMT, Chen Liang <li...@openjdk.org> wrote:

>> When core reflection was migrated to be implemented by Method Handles, 
>> somehow, the method handles are not used for native methods, which are 
>> generally linkable by method handles.  This causes significant performance 
>> regressions when reflecting native methods, even if their overrides may be 
>> non-native methods.  This is evident in `Object.clone` and `Object.hashCode` 
>> as shown in the original report.
>> 
>> I believe the blanket restriction previously placed on the native methods 
>> was because of signature polymorphic methods ([JLS 
>> 15.12.3](https://docs.oracle.com/javase/specs/jls/se23/html/jls-15.html#jls-15.12.3),
>>  [JVMS 
>> 2.9.3](https://docs.oracle.com/javase/specs/jvms/se23/html/jvms-2.html#jvms-2.9.3))
>>  for MethodHandle and VarHandle; method handles do not link to the backing 
>> implementation that throws UOE while core reflection is required to do so.  
>> I have narrowed the restrictions to be specifically against these methods.
>> 
>> Additionally, I cleaned up another check for invalid varargs flag.  
>> Together, I clarified the scenarios where native method accessors are used - 
>> all to bypass restrictions of java.lang.invoke.
>> 
>> Testing: tier 1-5 green
>
> Thanks for the test on `Object.hashCode` and `Thread.currentThread` to 
> confirm my guess.
> 
> For the `toString` test:
> 1. I don't think I will fix it as part of this PR; we will create a new issue 
> for it once we confirm it.
> 2. To reproduce, I think first we will test with JDK 17 and 21. Core 
> reflection reimplementation happened in JDK 18.
> 3. For reliable results, I suggest using the JMH tool 
> https://github.com/openjdk/jmh; there is a gradle plugin for it 
> https://github.com/melix/jmh-gradle-plugin and it has a gradle project 
> example 
> https://github.com/melix/jmh-gradle-plugin/tree/master/samples/simple-java/groovy-dsl,
>  as your raw "setup" and system-time based checks have a lot of disturbance.
> 
>> Because of the bug report web can not submit new comment with some web error
> 
> I am sorry, but OpenJDK infrastructure currently has some known issues; even 
> we are automatically logged out. Thank you for coming to the github PR for 
> comments, @moooonk!

Thank you for your suggestion, @liach 
I reimplement test case project with jmh,if you need to check the source 
code,see in 
[https://github.com/moooonk/reflect-test](https://github.com/moooonk/reflect-test)
Now we get more accurate new benchmark result:
JDK17:
Benchmark Mode Cnt Score Error Units
RunBenchmark.cloneCase1 thrpt 5 830871722.632 ± 14902415.558 ops/s
RunBenchmark.cloneCase2 thrpt 5 832256881.789 ± 9305066.153 ops/s
RunBenchmark.cloneCase3 thrpt 5 827842981.397 ± 8629836.251 ops/s
RunBenchmark.hashCodeCase1 thrpt 5 726644716.300 ± 4504879.585 ops/s
RunBenchmark.hashCodeCase2 thrpt 5 726540126.956 ± 7249056.369 ops/s
RunBenchmark.hashCodeCase3 thrpt 5 729054390.940 ± 11904383.303 ops/s
RunBenchmark.toStringCase1 thrpt 5 42906690.075 ± 268508.159 ops/s
RunBenchmark.toStringCase2 thrpt 5 41641490.800 ± 271577.545 ops/s
RunBenchmark.toStringCase3 thrpt 5 41824727.616 ± 440507.690 ops/s

JDK21;
Benchmark Mode Cnt Score Error Units
RunBenchmark.cloneCase1 thrpt 5 8783640.822 ± 46196.518 ops/s
RunBenchmark.cloneCase2 thrpt 5 13045394.145 ± 157121.364 ops/s
RunBenchmark.cloneCase3 thrpt 5 2320020521.800 ± 56423864.542 ops/s
RunBenchmark.hashCodeCase1 thrpt 5 11495229.964 ± 110515.482 ops/s
RunBenchmark.hashCodeCase2 thrpt 5 11488996.620 ± 72449.931 ops/s
RunBenchmark.hashCodeCase3 thrpt 5 1590063332.584 ± 15874384.555 ops/s
RunBenchmark.toStringCase1 thrpt 5 40532553.791 ± 349765.261 ops/s
RunBenchmark.toStringCase2 thrpt 5 40912699.225 ± 339420.788 ops/s
RunBenchmark.toStringCase3 thrpt 5 40991023.028 ± 280145.682 ops/s

I hope this can help you! If need any support just let me know.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/22169#issuecomment-2491923108

Reply via email to