On Sun, 24 Dec 2023 03:14:44 GMT, Chen Liang <li...@openjdk.org> wrote:
>> Adam Sotona has updated the pull request incrementally with one additional >> commit since the last revision: >> >> minor StackCounter fix > > src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java line 737: > >> 735: private void generateMethod(ClassBuilder clb, ClassEntry >> className) { >> 736: var cp = clb.constantPool(); >> 737: var desc = new StringJoiner("", "(", ")" + >> returnType.descriptorString()); > > We should just use an MTD here; the MTD will be passed to StackCounter so we > don't have to recompute a MTD. > > The MT to MTD conversion shouldn't be too costly; the overhead probably comes > from Optional, which we have to wait until Valhalla, as proxy generation is > unlikely to be hot and compiled by C2. Original code has been significant in profiler. MethodTypeDesc desc = MethodTypeDesc.of(toClassDesc(returnType), Arrays.stream(parameterTypes).map(ProxyGenerator::toClassDesc).toArray(ClassDesc[]::new)); 1. each `toClassDesc` builds `descriptorString` and parses/validates it while constructing `ClassDesc` 2. `Arrays.stream(...).map(...).toArray(...)` allocates an array 3. `MethodTypeDesc.of(...)` clones the array and iterates params to check for void 4. `desc.descriptorString()` then finally use the `StringJoiner` Optimized code only joins `descriptorString`, no validations, no streaming, no arrays, no cloning. I suggest this patch as this code is considered as performance critical. However we can go through `ClassDesc` and `MethodTypeDesc` if not performance critical or if the conversions would be optimized. For example better (trusted) paths from `MethodType` to `MethodTypeDescriptor` and from `Class` to `ClassDesc`, avoiding at least validations. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/17121#discussion_r1440395021